Python

bdb — 디버거 프레임워크

소스 코드: Lib/bdb.py


bdb 모듈은 중단점 설정이나 디버거를 통한 실행 관리와 같은 기본 디버거 기능을 처리합니다.

다음 예외가 정의됩니다:

exception bdb.BdbQuit

디버거를 종료하기 위해 Bdb 클래스가 발생시키는 예외.

bdb 모듈은 또한 두 가지 클래스를 정의합니다:

class bdb.Breakpoint(self, file, line, temporary=False, cond=None, funcname=None)

이 클래스는 임시 중단점, 무시 카운트, 비활성화와 (재) 활성화 및 조건을 구현합니다.

중단점은 bpbynumber라는 리스트를 통해 번호로, bplist를 통해 (file, line) 쌍으로 인덱싱됩니다. 전자는 Breakpoint 클래스의 단일 인스턴스를 가리킵니다. 후자는 줄당 하나 이상의 중단점이 있을 수 있어서 이러한 인스턴스의 리스트를 가리킵니다.

중단점을 만들 때, 연관된 파일명은 규범적 형식(canonical form)이어야 합니다. funcname이 정의되면, 해당 함수의 첫 번째 줄이 실행될 때 중단점 적중이 카운트됩니다. 조건부 중단점은 항상 적중을 카운트합니다.

Breakpoint 인스턴스에는 다음과 같은 메서드가 있습니다:

deleteMe()

file/line과 관련된 리스트에서 중단점을 삭제합니다. 해당 위치의 마지막 중단점이면, file/line의 항목도 삭제합니다.

enable()

중단점을 활성화된 것으로 표시합니다.

disable()

중단점을 비활성화된 것으로 표시합니다.

bpformat()

멋지게 포맷된, 중단점에 대한 모든 정보가 포함된 문자열을 반환합니다:

  • 중단점 번호.

  • 임시 상태 (삭제하거나 유지).

  • File/line 위치.

  • 중단 조건.

  • 무시해야 하는 횟수.

  • 적중 횟수.

Added in version 3.2.

bpprint(out=None)

bpformat()의 출력을 파일 out, 또는 None이면 표준 출력으로 인쇄합니다.

Breakpoint 인스턴스에는 다음과 같은 어트리뷰트가 있습니다:

file

:class:`Breakpoint`의 파일 이름입니다.

line

file 내에서 :class:`Breakpoint`의 줄 번호입니다.

temporary

(file, line)의 Breakpoint 가 임시인지 True 를 반환합니다.

cond

(file, line)의 :class:`Breakpoint`를 평가하는 조건입니다.

funcname

:class:`Breakpoint`가 함수 진입 시 중단되는지 여부를 정의하는 함수 이름입니다.

enabled

Breakpoint 가 활성화되었으면 True 를 반환합니다.

bpbynumber

Breakpoint 인스턴스에 대한 고유 번호입니다.

bplist

Dictionary of Breakpoint instances indexed by (file, line) tuples.

ignore

무시할 :class:`Breakpoint`의 횟수입니다.

hits

:class:`Breakpoint`가 적중된 횟수입니다.

class bdb.Bdb(skip=None, backend='settrace')

Bdb 클래스는 범용 파이썬 디버거 베이스 클래스 역할을 합니다.

이 클래스는 추적 기능의 세부 사항을 처리합니다; 파생 클래스는 사용자 상호 작용을 구현해야 합니다. 표준 디버거 클래스 (pdb.Pdb)가 예입니다.

skip 인자는, 주어지면, glob 스타일 모듈 이름 패턴의 이터러블 이어야 합니다. 디버거는 이러한 패턴 중 하나와 일치하는 모듈에서 시작되는 프레임으로 들어가지 않습니다. 프레임을 특정 모듈에서 시작된 것으로 간주하는지는 프레임 전역의 __name__에 의해 결정됩니다.

backend 인수는 Bdb`에 사용할 백엔드를 지정합니다. `’settrace’`` 또는 'monitoring'``일 있습니다. ``'settrace'``는 최적의 하위 호환성을 가진 :func:`sys.settrace`를 사용합니다. ``'monitoring' 백엔드는 Python 3.12에서 도입된 새로운 sys.monitoring`을 사용하여, 사용하지 않는 이벤트를 비활성화할 있어 훨씬 효율적일 있습니다. 저희는 백엔드에 대한 정확한 인터페이스를 유지하려고 노력하고 있지만, 약간의 차이점이 있습니다. 디버거 개발자들에게는 나은 성능을 위해 `’monitoring’`` 백엔드를 사용할 것을 권장합니다.

버전 3.1에서 변경: skip 매개 변수를 추가했습니다.

버전 3.14에서 변경: backend 매개 변수가 추가되었습니다.

Bdb의 다음 메서드는 일반적으로 재정의할 필요가 없습니다.

canonic(filename)

filename의 규범적 형식을 반환합니다.

실제 파일 이름의 규범적 형식은 운영 체제에 따라 달라지는, case-normalized absolute path 입니다. 인터랙티브 모드에서 생성된 "<stdin>" 과 같은 꺽쇠 괄호가 있는 filename 은 변경되지 않은 채 반환됩니다.

start_trace(self)

추적을 시작합니다. 'settrace' 백엔드의 경우, 이 메서드는 sys.settrace(self.trace_dispatch) 와 동일합니다.

Added in version 3.14.

stop_trace(self)

추적을 중지합니다. 'settrace' 백엔드의 경우, 이 메서드는 sys.settrace(None) 와 동일합니다.

Added in version 3.14.

reset()

디버깅을 시작할 준비가 된 값으로 botframe, stopframe, returnframequitting 어트리뷰트를 설정합니다.

trace_dispatch(frame, event, arg)

이 함수는 디버그되는 프레임의 추적 함수(trace function)로 설치됩니다. 반환 값은 새로운 추적 함수(대부분 자체)입니다.

기본 구현은 실행되려고 하는 (문자열로 전달된) 이벤트의 유형에 따라 프레임을 디스패치 하는 방법을 결정합니다. event는 다음 중 하나일 수 있습니다:

  • "line": 새로운 코드 줄이 실행되려고 합니다.

  • "call": 함수가 호출되거나, 다른 코드 블록에 진입하려고 합니다.

  • "return": 함수나 다른 코드 블록이 반환하려고 합니다.

  • "exception": 예외가 발생했습니다.

모든 이벤트에 대해, 특수 함수(아래를 참조하세요)가 호출됩니다.

arg 매개 변수는 앞의 이벤트에 따라 다릅니다.

추적 함수에 대한 자세한 내용은 sys.settrace() 설명서를 참조하십시오. 코드와 프레임 객체에 대한 자세한 내용은 표준형 계층을 참조하십시오.

dispatch_line(frame)

디버거가 현재 행에서 중지해야 하면, user_line() 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). quitting 플래그가 설정되면 (user_line()에서 설정할 수 있습니다) BdbQuit 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 trace_dispatch() 메서드에 대한 참조를 반환합니다.

dispatch_call(frame, arg)

디버거가 이 함수 호출에서 중지해야 하면, user_call() 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). quitting 플래그가 설정되면 (user_call()에서 설정할 수 있습니다) BdbQuit 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 trace_dispatch() 메서드에 대한 참조를 반환합니다.

dispatch_return(frame, arg)

디버거가 이 함수 반환에서 중지해야 하면, user_return() 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). quitting 플래그가 설정되면 (user_return()에서 설정할 수 있습니다) BdbQuit 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 trace_dispatch() 메서드에 대한 참조를 반환합니다.

dispatch_exception(frame, arg)

디버거가 이 예외에서 중지해야 하면, user_exception() 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). quitting 플래그가 설정되면 (user_exception()에서 설정할 수 있습니다) BdbQuit 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 trace_dispatch() 메서드에 대한 참조를 반환합니다.

일반적으로 파생된 클래스는 다음 메서드를 재정의하지 않지만, 중지와 중단점의 정의를 재정의하려고 하면 그럴 수 있습니다.

is_skipped_module(module_name)

module_name 이 스킵 패턴과 일치하면 True 를 반환합니다.

stop_here(frame)

frame 이 스택의 시작 프레임보다 아래에 있으면 True 를 반환합니다.

break_here(frame)

이 줄에 유효한 중단점이 있는지 True 를 반환합니다.

라인 또는 함수 중단점이 존재하며 효과적인지 확인합니다. :func:`effective`에서 얻은 정보를 기반으로 임시 중단점을 삭제합니다.

break_anywhere(frame)

frame 의 파일명에 어떤 중단점이 존재하는지 True 를 반환합니다.

파생 클래스는 디버거 연산을 제어하기 위해 이 메서드를 재정의해야 합니다.

user_call(frame, argument_list)

호출된 함수 내부에서 중단이 발생할 수 있으면 dispatch_call()에서 호출됩니다.

argument_list 는 더 이상 사용되지 않으며 항상 None 입니다. 이 인수는 하위 호환성을 위해 유지됩니다.

user_line(frame)

stop_here()break_here()True를 반환할 때 dispatch_line()에서 호출됩니다.

user_return(frame, return_value)

stop_here()True를 반환할 때 dispatch_return()에서 호출됩니다.

user_exception(frame, exc_info)

stop_here()True를 반환할 때 dispatch_exception()에서 호출됩니다.

do_clear(arg)

중단점이 일시적일 때 중단점을 제거하는 방법을 처리합니다.

이 메서드는 파생 클래스에서 구현해야 합니다.

파생 클래스와 클라이언트는 다음 메서드를 호출하여 스테핑(stepping) 상태에 영향을 줄 수 있습니다.

set_step()

한 줄의 코드 후에 멈춥니다.

set_next(frame)

주어진 프레임 내 또는 아래의 다음 줄에서 멈춥니다.

set_return(frame)

주어진 프레임에서 반환할 때 멈춥니다.

set_until(frame, lineno=None)

현재 줄보다 큰 lineno를 갖는 줄에 도달하거나 현재 프레임에서 반환할 때 멈춥니다.

set_trace([frame])

frame에서 디버깅을 시작합니다. frame을 지정하지 않으면 호출자의 프레임에서 디버깅을 시작합니다.

버전 3.13에서 변경: :func:`set_trace`는 다음에 실행될 코드 라인에서가 아니라 즉시 디버거에 진입합니다.

set_continue()

중단점에서나 완료 시에만 멈춥니다. 중단점이 없으면, 시스템 추적 함수를 None으로 설정합니다.

set_quit()

quitting 어트리뷰트를 True로 설정합니다. 다음에 dispatch_*() 메서드 중 하나를 호출할 때 BdbQuit가 발생합니다.

파생 클래스와 클라이언트는 다음 메서드를 호출하여 중단점을 조작할 수 있습니다. 이 메서드는 문제가 발생하면 에러 메시지가 포함된 문자열을 반환하고, 모두 정상이면 None을 반환합니다.

set_break(filename, lineno, temporary=False, cond=None, funcname=None)

새로운 중단점을 설정합니다. 인자로 전달된 filenamelineno 줄이 없으면 에러 메시지를 반환합니다. canonic() 메서드에 설명된 대로 filename은 규범적 형식이어야 합니다.

clear_break(filename, lineno)

filenamelineno에서 중단점을 삭제합니다. 설정되지 않았으면, 에러 메시지를 반환합니다.

clear_bpbynumber(arg)

Breakpoint.bpbynumber에서 인덱스 arg인 중단점을 삭제합니다. arg가 숫자가 아니거나 범위를 벗어나면, 에러 메시지를 반환합니다.

clear_all_file_breaks(filename)

filename에서 모든 중단점을 삭제합니다. 설정되지 않았으면, 에러 메시지를 반환합니다.

clear_all_breaks()

모든 기존 중단점을 삭제합니다. 설정되지 않았으면, 에러 메시지를 반환합니다.

get_bpbynumber(arg)

주어진 숫자로 지정된 중단점을 반환합니다. arg가 문자열이면, 숫자로 변환됩니다. arg가 숫자가 아닌 문자열이면, 지정된 중단점이 존재하지 않거나 삭제되었으면, ValueError가 발생합니다.

Added in version 3.2.

get_break(filename, lineno)

filenamelineno에 중단점이 있으면 True를 반환합니다.

get_breaks(filename, lineno)

filenamelineno에 있는 모든 중단점을 반환하거나, 없으면 빈 리스트를 반환합니다.

get_file_breaks(filename)

filename의 모든 중단점을 반환하거나, 없으면 빈 리스트를 반환합니다.

get_all_breaks()

설정된 모든 중단점을 반환합니다.

파생 클래스와 클라이언트들은 더 나은 성능을 얻기 위해 다음 메서드를 호출하여 이벤트를 비활성화하고 재시작할 수 있습니다. 이 메서드들은 'monitoring' 백엔드를 사용할 때만 작동합니다.

disable_current_event()

다음 :func:`restart_events`가 호출될 때까지 현재 이벤트를 비활성화합니다. 이는 디버거가 현재 라인에 관심이 없을 때 유용합니다.

Added in version 3.14.

restart_events()

비활성화된 모든 이벤트를 재시작합니다. 이 함수는 user_* 메서드가 호출된 후 dispatch_* 메서드 내에서 자동으로 호출됩니다. dispatch_* 메서드를 오버라이드하지 않은 경우, 사용자의 상호 작용 후에 비활성화된 이벤트가 다시 시작됩니다.

Added in version 3.14.

파생 클래스와 클라이언트는 다음 메서드를 호출하여 스택 추적을 나타내는 데이터 구조를 얻을 수 있습니다.

get_stack(f, t)

스택 추적의 (frame, lineno) 튜플 리스트와 크기를 반환합니다.

가장 최근에 호출된 프레임이 리스트의 마지막에 있습니다. 크기는 디버거가 호출된 프레임 아래의 프레임 수를 나타냅니다.

format_stack_entry(frame_lineno, lprefix=': ')

(frame, lineno) 튜플인 스택 항목에 대한 정보가 포함된 문자열을 반환합니다. 반환 문자열은 다음을 포함합니다:

  • 프레임을 포함하는 규범적 파일명.

  • 함수 이름이나 "<lambda>".

  • 입력 인자.

  • 반환 값.

  • 코드 줄 (있으면).

클라이언트가 문자열로 지정된 statement를 디버깅하기 위해 디버거를 사용하려면 다음 두 가지 메서드를 호출할 수 있습니다.

run(cmd, globals=None, locals=None)

exec() 함수를 통해 실행된 문장을 디버그합니다. globals의 기본값은 __main__.__dict__이고, locals의 기본값은 globals입니다.

runeval(expr, globals=None, locals=None)

eval() 함수를 통해 실행된 표현식을 디버그합니다. globalslocalsrun()과 같은 의미입니다.

runctx(cmd, globals, locals)

이전 버전과의 호환성을 위해. run() 메서드를 호출합니다.

runcall(func, /, *args, **kwds)

단일 함수 호출을 디버그하고, 결과를 반환합니다.

마지막으로, 모듈은 다음과 같은 함수를 정의합니다:

bdb.checkfuncname(b, frame)

Breakpoint b가 설정된 방식에 따라, 여기서 중단해야 하면 True를 반환합니다.

줄 번호를 통해 설정되었으면, b.lineframe의 것과 같은지 확인합니다. 함수 이름을 통해 중단점이 설정되었으면, 우리는 올바른 frame(올바른 함수)에 있는지와 그것의 첫 번째 실행 가능한 줄에 있는지 확인해야 합니다.

bdb.effective(file, line, frame)

처리할 중단점의 (활성 중단점, 임시 삭제 플래그) 또는 (None, None) 을 반환합니다.

active breakpoint 는 (파일, )에 대해 enabled 가 true이며, checkfuncname() 이 true이고, 거짓인 condition 나 양수 ignore 카운트가 없는 bplist 의 첫 번째 항목입니다. 플래그 는 임시 중단점을 삭제해야 함을 의미하며, cond 를 평가할 수 없는 경우에만 False 입니다 (이 경우, ignore 카운트는 무시됩니다).

이러한 항목이 존재하지 않으면, (None, None) 이 반환됩니다.

bdb.set_trace()

호출자의 프레임에서 Bdb 인스턴스로 디버깅을 시작합니다.

분실물 보관소