pdb — Python 디버거

pdb — Python 디버거

소스 코드: Lib/pdb.py

pdb 모듈은 Python 프로그램용 대화형 소스 코드 디버거를 정의해요. (조건부) 중단점 설정과 소스 줄 수준의 단일 단계 실행, 스택 프레임 검사, 소스 코드 나열, 그리고 모든 스택 프레임의 맥락에서 임의의 Python 코드 평가를 지원해요. 사후(post-mortem) 디버깅도 지원하며 프로그램 제어 하에 호출될 수 있어요.

디버거는 확장 가능해요. 실제로 Pdb 클래스로 정의돼요. 이것은 현재 문서화되어 있지 않지만 소스를 읽으면 쉽게 이해돼요. 확장 인터페이스는 bdbcmd 모듈을 사용해요.

참고

  • faulthandler 모듈 — 결함, 타임아웃 후, 또는 사용자 신호에서 Python traceback을 명시적으로 덤프하는 데 사용.
  • traceback 모듈 — Python 프로그램의 스택 추적을 추출·형식화·인쇄하는 표준 인터페이스.

디버거로 들어가는 전형적인 용법은 디버거로 들어가고 싶은 위치에 다음을 넣는 거예요:

import pdb; pdb.set_trace()

또는:

breakpoint()

그런 다음 프로그램을 실행해요. 그러면 이 문 다음의 코드를 단계별로 실행할 수 있고, continue 명령으로 디버거 없이 계속 실행할 수 있어요.

버전 3.7에서 변경: 내장 breakpoint()를 기본값으로 호출하면 import pdb; pdb.set_trace() 대신 사용할 수 있음.

def double(x):
    breakpoint()
    return x * 2
val = 3
print(f"{val} * 2 is {double(val)}")

디버거의 프롬프트는 (Pdb)인데, 디버그 모드에 있다는 지표예요:

> ...(2)double()
-> breakpoint()
(Pdb) p x
3
(Pdb) continue
3 * 2 is 6

버전 3.3에서 변경: 명령과 명령 인자에 대해 readline 모듈을 통한 탭 완성이 가능해짐. 예: 현재 전역·지역 이름이 p 명령의 인자로 제안됨.

출처: Python 표준 라이브러리

본문

명령줄 인터페이스 (Command-line interface)

명령줄에서 pdb를 호출해 다른 스크립트를 디버깅할 수도 있어요. 예:

python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]

모듈로 호출되면 디버깅 중인 프로그램이 비정상적으로 종료되면 pdb는 자동으로 사후 디버깅에 들어가요. 사후 디버깅 후(또는 프로그램의 정상 종료 후) pdb는 프로그램을 다시 시작해요. 자동 재시작은 pdb의 상태(중단점 같은)를 보존하며, 대부분의 경우 프로그램 종료 시 디버거를 종료하는 것보다 더 유용해요.

  • -c, --command <command>.pdbrc 파일에 주어진 것처럼 명령을 실행. 디버거 명령 참고.
  • -m <module>python -m과 비슷한 방식으로 모듈을 실행. 스크립트와 마찬가지로 모듈의 첫 줄 바로 앞에서 실행을 일시 중지해요.
  • -p, --pid <pid> — 지정된 PID를 가진 프로세스에 연결(attach).

*버전 3.2에서 변경: -c 옵션 추가. / *버전 3.7에서 변경: -m 옵션 추가. / 버전 3.14에 추가: -p 옵션.

실행 중인 Python 프로세스에 원격 디버깅을 위해 연결하려면 대상 프로세스의 PID와 함께 -p 또는 --pid 옵션을 사용해요:

python -m pdb -p 1234

참고 — 시스템 호출에 차단되거나 I/O를 기다리는 프로세스에 연결하는 것은 다음 바이트코드 명령이 실행되거나 프로세스가 신호를 받을 때만 작동해요.

디버거 제어 하에 문을 실행하는 전형적인 용법은:

>>> import pdb
>>> def f(x):
...     print(1 / x)
>>> pdb.run("f(2)")
> <string>(1)<module>()
(Pdb) continue
0.5
>>>

크래시된 프로그램을 검사하는 전형적인 용법은:

>>> import pdb
>>> def f(x):
...     print(1 / x)
...
>>> f(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
ZeroDivisionError: division by zero
>>> pdb.pm()
> <stdin>(2)f()
(Pdb) p x
0
(Pdb)

버전 3.13에서 변경: PEP 667의 구현으로 pdb를 통한 이름 할당이 최적화된 스코프 안에서 실행 중에도 즉시 활성 스코프에 영향을 줌.

이 모듈은 다음 함수를 정의하며, 각각 약간 다른 방식으로 디버거에 들어가요:

pdb.run(statement, globals=None, locals=None)

디버거 제어 하에 문(문자열 또는 코드 객체로 주어짐)을 실행해요. 어떤 코드가 실행되기 전에 디버거 프롬프트가 나타나요. 중단점을 설정하고 continue를 입력하거나, step이나 next로 문을 단계별로 실행할 수 있어요(이 모든 명령은 아래에 설명돼요). 선택적 globalslocals 인자는 코드가 실행되는 환경을 지정해요. 기본적으로 __main__ 모듈의 사전이 사용돼요(내장 exec() 또는 eval() 함수의 설명 참고).

pdb.runeval(expression, globals=None, locals=None)

디버거 제어 하에 표현식(문자열 또는 코드 객체로 주어짐)을 평가해요. runeval()이 반환하면 표현식의 값을 반환해요. 그 외에는 이 함수는 run()과 비슷해요.

pdb.runcall(function, *args, **kwds)

주어진 인자로 함수(문자열이 아닌 함수 또는 메서드 객체)를 호출해요. runcall()이 반환하면 함수 호출이 반환한 값을 반환해요. 함수에 들어가자마자 디버거 프롬프트가 나타나요.

pdb.set_trace(*, header=None, commands=None)

호출 스택 프레임에서 디버거에 들어가요. 코드가 디버깅되지 않더라도(예: assertion 실패 시) 프로그램의 주어진 지점에 중단점을 하드코딩하는 데 유용해요. 주어지면 header가 디버깅이 시작되기 직전에 콘솔에 인쇄돼요. 주어지면 commands 인자는 디버거가 시작될 때 실행할 명령의 리스트예요.

*버전 3.7에서 변경: 키워드 전용 인자 header. / *버전 3.13에서 변경: set_trace()는 실행될 다음 코드 줄이 아니라 즉시 디버거에 들어감. / 버전 3.14에 추가: commands 인자.

awaitable pdb.set_trace_async(*, header=None, commands=None)

set_trace()의 async 버전이에요. 이 함수는 await와 함께 async 함수 안에서 사용해야 해요.

async def f():
    await pdb.set_trace_async()

이 함수로 디버거가 호출되면 await 문이 지원돼요.

버전 3.14에 추가.

pdb.post_mortem(t=None)

주어진 예외 또는 traceback 객체의 사후 디버깅에 들어가요. 값이 주어지지 않으면 현재 처리 중인 예외를 사용하고, 없으면 ValueError를 발생시켜요.

버전 3.13에서 변경: 예외 객체 지원 추가.

pdb.pm()

s y s.last_e xc에서 찾은 예외의 사후 디버깅에 들어가요.

pdb.set_default_backend(backend)

pdb에는 'settrace''monitoring' 두 가지 지원 백엔드가 있어요. 자세한 내용은 bdb.Bdb를 참고하세요. 사용자는 Pdb를 인스턴스화할 때 지정하지 않으면 사용할 기본 백엔드를 설정할 수 있어요. 백엔드가 지정되지 않으면 기본값은 'settrace'예요.

참고breakpoint()set_trace()는 이 함수의 영향을 받지 않고, 항상 'monitoring' 백엔드를 사용해요.

버전 3.14에 추가.

pdb.get_default_backend()

pdb의 기본 백엔드를 반환해요.

버전 3.14에 추가.

run* 함수와 set_trace()Pdb 클래스를 인스턴스화하고 같은 이름의 메서드를 호출하는 별칭이에요. 더 많은 기능에 접근하려면 직접 해야 해요:

class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False)

Pdb는 디버거 클래스예요.

completekey, stdin, stdout 인자는 기본 cmd.Cmd 클래스로 전달돼요. 거기서 설명을 참고하세요.

주어지면 skip 인자는 glob 스타일 모듈 이름 패턴의 iterable이어야 해요. 디버거는 이러한 패턴 중 하나와 일치하는 모듈에서 시작된 프레임으로는 단계적으로 들어가지 않아요. [1]

기본적으로 Pdbcontinue 명령을 줄 때 SIGINT 신호(콘솔에서 Ctrl-C를 누를 때 보내지는)의 핸들러를 설정해요. 이렇게 하면 Ctrl-C를 눌러 다시 디버거에 들어갈 수 있어요. Pdb가 SIGINT 핸들러를 건드리지 않게 하려면 nosigint를 참으로 설정하세요.

readrc 인자는 기본적으로 참이며, Pdb가 파일 시스템에서 .pdbrc 파일을 로드할지 제어해요.

mode 인자는 디버거가 어떻게 호출되었는지 지정해요. 일부 디버거 명령의 작동에 영향을 줘요. 유효한 값은 'inline'(breakpoint() 내장이 사용), 'cli'(명령줄 호출이 사용) 또는 None(mode 인자가 추가되기 전처럼 하위 호환 동작)이에요.

backend 인자는 디버거에 사용할 백엔드를 지정해요. None이 전달되면 기본 백엔드가 사용돼요(set_default_backend() 참고). 그 외 지원 백엔드는 'settrace''monitoring'이에요.

colorize 인자를 True로 설정하면 색상이 지원될 때 디버거에서 색상화된 출력을 활성화해요. 그러면 pdb에 표시되는 소스 코드가 강조돼요.

skip으로 추적을 활성화하는 예시 호출:

import pdb; pdb.Pdb(skip=['django.*']).set_trace()

인자 없이 감사 이벤트 pdb.Pdb를 발생시켜요.

*버전 3.1에서 변경: skip 매개변수 추가. / *버전 3.2에서 변경: nosigint 매개변수 추가. 이전에는 Pdb가 SIGINT 핸들러를 설정한 적이 없었음. / *버전 3.6에서 변경: readrc 인자. / *버전 3.14에 추가: mode·backend·colorize 인자. / 버전 3.14에서 변경: breakpoint()pdb.set_trace() 같은 인라인 중단점은 항상 호출 프레임에서 프로그램을 멈추고, skip 패턴을 무시함.

run(statement, globals=None, locals=None) / runeval(expression, globals=None, locals=None) / runcall(function, *args, **kwds) / set_trace()

위에서 설명한 함수들의 문서를 참고하세요.

디버거 명령 (Debugger commands)

디버거가 인식하는 명령은 아래에 나열돼요. 대부분의 명령은 표시된 대로 한두 글자로 축약할 수 있어요. 예: h(elp)h 또는 help를 사용해 help 명령에 들어갈 수 있다는 뜻(단, hehel, 또 HHelp 또는 HELP는 안 됨). 명령 인자는 공백(스페이스나 탭)으로 구분해야 해요. 선택적 인자는 명령 구문에서 대괄호([])로 감싸져요. 대괄호는 입력하면 안 돼요. 명령 구문의 대안은 세로 막대(|)로 구분돼요.

빈 줄을 입력하면 마지막으로 입력한 명령을 반복해요. 예외: 마지막 명령이 list 명령이었다면 다음 11줄이 나열돼요.

디버거가 인식하지 못하는 명령은 Python 문으로 가정되어 디버깅 중인 프로그램의 맥락에서 실행돼요. Python 문은 느낌표(!)로 접두사를 붙일 수도 있어요. 이것은 디버깅 중인 프로그램을 검사하는 강력한 방법이에요. 변수를 바꾸거나 함수를 호출하는 것도 가능해요. 그런 문에서 예외가 발생하면 예외 이름이 인쇄되지만 디버거의 상태는 바뀌지 않아요.

버전 3.13에서 변경: 접두사가 pdb 명령인 표현식/문이 이제 올바르게 식별되어 실행됨.

디버거는 별칭(aliases)을 지원해요. 별칭은 매개변수를 가질 수 있어 조사 중인 맥락에 어느 정도 적응할 수 있게 해 줘요.

여러 명령을 ;;로 구분해 한 줄에 입력할 수 있어요(단일 ;는 Python 파서에 전달되는 줄의 여러 명령 구분자이므로 사용되지 않아요). 명령을 구분하는 데 지능이 적용되지 않아요. 입력은 인용된 문자열 중간에 있어도 첫 ;; 쌍에서 분할돼요. 이중 세미콜론이 있는 문자열의 해결 방법은 암시적 문자열 연결 ';'';' 또는 ";"";"를 사용하는 거예요.

임시 전역 변수를 설정하려면 편의 변수(convenience variable)를 사용해요. 편의 변수는 이름이 $로 시작하는 변수예요. 예를 들어 $foo = 1은 디버거 세션에서 사용할 수 있는 전역 변수 $foo를 설정해요. 프로그램이 실행을 재개하면 편의 변수가 지워지므로, foo = 1 같은 일반 변수를 사용하는 것보다 프로그램을 방해할 가능성이 낮아요.

미리 설정된 편의 변수 네 가지가 있어요:

  • $_frame — 디버깅 중인 현재 프레임
  • $_retval — 프레임이 반환하는 경우 반환 값
  • $_exception — 프레임이 예외를 발생시키는 경우 그 예외
  • $_asynctask — pdb가 async 함수에서 멈추는 경우 asyncio 태스크

*버전 3.12에 추가: 편의 변수 기능. / 버전 3.14에 추가: $_asynctask 편의 변수.

사용자의 홈 디렉터리나 현재 디렉터리에 .pdbrc 파일이 있으면 'utf-8' 인코딩으로 읽혀 마치 디버거 프롬프트에 입력된 것처럼 실행되지만, 빈 줄과 #로 시작하는 줄은 무시돼요. 이것은 별칭에 특히 유용해요. 두 파일이 모두 있으면 홈 디렉터리의 파일이 먼저 읽히고, 거기 정의된 별칭은 로컬 파일이 덮어쓸 수 있어요.

*버전 3.2에서 변경: .pdbrc가 이제 continuenext 같은 디버깅을 계속하는 명령을 포함할 수 있음. 이전에는 이런 명령이 효과가 없었음. / 버전 3.11에서 변경: .pdbrc가 이제 'utf-8' 인코딩으로 읽힘. 이전에는 시스템 로케일 인코딩으로 읽혔음.

h(elp) [command]

인자 없이 사용 가능한 명령 목록을 인쇄해요. 명령을 인자로 주면 그 명령에 대한 도움말을 인쇄해요. help pdb는 전체 문서(pdb 모듈의 docstring)를 표시해요. 명령 인자가 식별자여야 하므로 ! 명령에 대한 도움말을 얻으려면 help exec를 입력해야 해요.

w(here) [count]

스택 추적을 인쇄하며, 가장 최근 프레임이 맨 아래예요. count가 0이면 현재 프레임 항목을 인쇄해요. count가 음수면 가장 오래된 - count 프레임을 인쇄해요. count가 양수면 가장 최근 count 프레임을 인쇄해요. 화살표(>)는 대부분 명령의 맥락을 결정하는 현재 프레임을 나타내요.

버전 3.14에서 변경: count 인자 추가.

d(own) [count]

스택 추적에서 현재 프레임을 count(기본값 1) 수준 아래로(더 새로운 프레임으로) 이동해요.

u(p) [count]

스택 추적에서 현재 프레임을 count(기본값 1) 수준 위로(더 오래된 프레임으로) 이동해요.

b(reak) [([filename:]lineno | function) [, condition]]

lineno 인자로 현재 파일의 lineno 줄에 중단점을 설정해요. 줄 번호 앞에 파일 이름과 콜론을 붙여 아직 로드되지 않았을 수 있는 다른 파일에 중단점을 지정할 수 있어요. 파일은 sys.path에서 검색돼요. 허용되는 파일 이름 형태는 /abspath/to/file.py, relpath/file.py, modulepackage.module이에요.

function 인자로 그 함수 안의 첫 실행 문에 중단점을 설정해요. function은 현재 네임스페이스에서 함수로 평가되는 어떤 표현식이든 될 수 있어요.

두 번째 인자가 있으면 중단점이 존중되기 전에 참으로 평가되어야 하는 표현식이에요.

인자 없이 모든 중단을 나열해요. 각 중단점에 대해 그 중단점이 적중된 횟수, 현재 무시 횟수, 관련 조건(있으면)을 포함해요.

각 중단점에는 다른 모든 중단점 명령이 참조하는 번호가 할당돼요.

tbreak [([filename:]lineno | function) [, condition]]

임시 중단점으로, 처음 적중되면 자동으로 제거돼요. 인자는 break와 동일해요.

cl(ear) [filename:lineno | bpnumber ...]

filename:lineno 인자로 이 줄의 모든 중단점을 지워요. 공백으로 구분된 중단점 번호 목록으로 그 중단점들을 지워요. 인자 없이 모든 중단을 지워요(먼저 확인을 요청).

disable bpnumber [bpnumber ...]

공백으로 구분된 중단점 번호 목록으로 주어진 중단점들을 비활성화해요. 중단점을 비활성화한다는 것은 그 중단점이 프로그램 실행을 멈추게 할 수 없다는 뜻이지만, 중단점을 지우는 것과 달리 중단점 목록에 남아 (다시) 활성화할 수 있어요.

enable bpnumber [bpnumber ...]

지정된 중단점들을 활성화해요.

ignore bpnumber [count]

주어진 중단점 번호에 대한 무시 횟수를 설정해요. count가 생략되면 무시 횟수는 0으로 설정돼요. 중단점은 무시 횟수가 0일 때 활성화돼요. 0이 아니면 중단점에 도달할 때마다 횟수가 감소하고, 중단점이 비활성화되지 않고 관련 조건이 참으로 평가되면 그래요.

condition bpnumber [condition]

중단점에 대한 새 조건, 즉 중단점이 존중되기 전에 참으로 평가되어야 하는 표현식을 설정해요. condition이 없으면 기존 조건이 제거되고, 즉 중단점이 무조건적으로 만들어져요.

commands [bpnumber]

중단점 번호 bpnumber에 대한 명령 목록을 지정해요. 명령 자체는 다음 줄에 나타나요. end만 포함하는 줄을 입력해 명령을 종료해요. 예:

(Pdb) commands 1
(com) p some_variable
(com) end
(Pdb)

중단점에서 모든 명령을 제거하려면 commands를 입력하고 바로 end를 따라 입력해요. 즉 명령을 주지 않는 거예요.

bpnumber 인자 없이 commands는 마지막으로 설정된 중단점을 참조해요. 중단점 명령을 사용해 프로그램을 다시 시작할 수 있어요. 그냥 continue 명령이나 step, 또는 실행을 재개하는 다른 어떤 명령을 사용하면 돼요. 실행을 재개하는 어떤 명령(현재 continue, step, next, return, until, jump, quit과 그 축약)을 지정하면 명령 목록을 종료해요(그 명령 바로 뒤에 end가 오는 것처럼). 이것은 실행을 재개할 때마다(단순한 nextstep이라도) 다른 중단점을 만날 수 있기 때문인데, 그 중단점이 자체 명령 목록을 가질 수 있어 어떤 목록을 실행할지 모호해지기 때문이에요.

명령 목록에 silent 명령이나 실행을 재개하는 명령이 포함되면 프레임에 대한 정보를 담은 중단점 메시지가 표시되지 않아요.

버전 3.14에서 변경: 명령 목록에 실행을 재개하는 명령이 있으면 프레임 정보가 표시되지 않음.

s(tep)

현재 줄을 실행하고, 첫 번째 가능한 경우(호출된 함수 또는 현재 함수의 다음 줄)에 멈춰요.

n(ext)

현재 함수의 다음 줄에 도달하거나 반환할 때까지 실행을 계속해요. (nextstep의 차이는 step은 호출된 함수 안에서 멈추지만, next는 호출된 함수를 (거의) 최고 속도로 실행하고 현재 함수의 다음 줄에서만 멈추는 거예요.)

unt(il) [lineno]

인자 없이 현재보다 큰 번호의 줄에 도달할 때까지 실행을 계속해요. lineno로, lineno보다 크거나 같은 번호의 줄에 도달할 때까지 계속해요. 두 경우 모두 현재 프레임이 반환할 때도 멈춰요.

버전 3.2에서 변경: 명시적 줄 번호 허용.

r(eturn)

현재 함수가 반환할 때까지 실행을 계속해요.

c(ont(inue))

중단점을 만날 때만 멈추고 실행을 계속해요.

j(ump) lineno

실행될 다음 줄을 설정해요. 맨 아래 프레임에서만 사용 가능해요. 이것은 돌아가서 코드를 다시 실행하거나, 앞으로 점프해 실행하고 싶지 않은 코드를 건너뛰게 해 줘요.

모든 점프가 허용되는 것은 아니라는 점에 주의하세요. 예를 들어 for 루프의 중간으로 또는 finally 절 밖으로 점프하는 것은 불가능해요.

l(ist) [first[, last]]

현재 파일의 소스 코드를 나열해요. 인자 없이 현재 줄 주변의 11줄을 나열하거나 이전 나열을 계속해요. . 인자로 현재 줄 주변 11줄을 나열해요. 인자 하나로 그 줄 주변 11줄을 나열해요. 인자 둘로 주어진 범위를 나열해요. 두 번째 인자가 첫 번째보다 작으면 횟수로 해석돼요.

현재 프레임의 현재 줄은 ->로 표시돼요. 예외가 디버깅 중이면 예외가 원래 발생하거나 전파된 줄이 현재 줄과 다르면 >>로 표시돼요.

버전 3.2에서 변경: >> 표식 추가.

ll | longlist

현재 함수 또는 프레임의 모든 소스 코드를 나열해요. 흥미로운 줄은 list에서처럼 표시돼요.

버전 3.2에 추가.

a(rgs)

현재 함수의 인자와 그 현재 값을 인쇄해요.

p expression

현재 맥락에서 expression을 평가하고 그 값을 인쇄해요.

참고print()도 사용할 수 있지만 디버거 명령이 아니에요. Python print() 함수를 실행하는 거예요.

pp expression

p 명령과 같지만, expression의 값이 pprint 모듈을 사용해 예쁘게 인쇄돼요.

whatis expression

expression의 유형을 인쇄해요.

source expression

expression의 소스 코드를 얻어 표시하려고 시도해요.

버전 3.2에 추가.

display [expression]

실행이 현재 프레임에서 멈출 때마다 expression의 값이 바뀌었으면 표시해요. expression 없이 현재 프레임의 모든 display 표현식을 나열해요.

참고 — display는 expression을 평가하고 이전 평가 결과와 비교하므로, 결과가 가변적이면 display가 변경을 포착하지 못할 수 있어요.

예:

lst = []
breakpoint()
pass
lst.append(1)
print(lst)

lst.append(1)이 비교되기 전에 평가 결과를 제자리에서 수정하므로 display는 lst가 바뀌었음을 인식하지 못해요:

> example.py(3)<module>()
-> pass
(Pdb) display lst
display lst: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
(Pdb)

복사 메커니즘으로 몇 가지 트릭을 사용해 작동하게 할 수 있어요:

> example.py(3)<module>()
-> pass
(Pdb) display lst[:]
display lst[:]: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
display lst[:]: [1] [old: []]
(Pdb)

버전 3.2에 추가.

undisplay [expression]

현재 프레임에서 더 이상 expression을 표시하지 않아요. expression 없이 현재 프레임의 모든 display 표현식을 지워요.

버전 3.2에 추가.

interact

현재 스코프의 지역·전역 네임스페이스에서 초기화된 새 전역 네임스페이스에서 대화형 인터프리터(code 모듈 사용)를 시작해요. 인터프리터를 종료하고 디버거로 돌아가려면 exit() 또는 quit()을 사용해요.

참고 — interact는 코드 실행을 위한 새 전용 네임스페이스를 만들므로 변수에 대한 할당은 원래 네임스페이스에 영향을 주지 않아요. 그러나 참조된 모든 가변 객체에 대한 수정은 평소처럼 원래 네임스페이스에 반영돼요.

*버전 3.2에 추가. / *버전 3.13에서 변경: exit()quit()을 사용해 interact 명령을 종료할 수 있음. / 버전 3.13에서 변경: interact는 출력을 sys.stderr가 아닌 디버거의 출력 채널로 보냄.

alias [name [command]]

command를 실행하는 name이라는 별칭을 만들어요. 명령은 따옴표로 감싸면 안 돼요. 교체 가능한 매개변수는 %1, %2, …, %9로 나타낼 수 있고, %*는 모든 매개변수로 대체돼요. command가 생략되면 name의 현재 별칭이 표시돼요. 인자가 없으면 모든 별칭이 나열돼요.

별칭은 중첩될 수 있고, pdb 프롬프트에서 합법적으로 입력할 수 있는 무엇이든 담을 수 있어요. 내부 pdb 명령은 별칭으로 덮어쓸 수 있다는 점에 주의하세요. 그러면 별칭이 제거될 때까지 그 명령은 숨겨져요. 별칭 처리는 명령 줄의 첫 단어에 재귀적으로 적용되고, 줄의 다른 모든 단어는 그대로 남아요.

예로, 유용한 두 별칭(.pdbrc 파일에 넣으면 특히 좋음):

# Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")
# Print instance variables in self
alias ps pi self

unalias name

지정된 별칭 이름을 삭제해요.

! statement

현재 스택 프레임의 맥락에서 (한 줄) 문을 실행해요. 문의 첫 단어가 디버거 명령과 비슷하지 않으면 느낌표를 생략할 수 있어요. 예:

(Pdb) ! n=42
(Pdb)

전역 변수를 설정하려면 같은 줄에 global 문을 할당 명령 앞에 접두사로 붙일 수 있어요. 예:

(Pdb) global list_options; list_options = ['-l']
(Pdb)

run [args ...] / restart [args ...]

디버깅 중인 Python 프로그램을 다시 시작해요. args가 공급되면 shlex로 분할되고 그 결과가 새 sys.argv로 사용돼요.

히스토리, 중단점, 액션, 디버거 옵션은 보존돼요. restartrun의 별칭이에요.

버전 3.14에서 변경: runrestart 명령은 디버거가 'inline' 모드로 호출되면 비활성화됨.

q(uit)

디버거를 종료해요. 실행 중인 프로그램이 중단돼요. 파일 끝 입력은 quit과 같아요.

디버거가 'inline' 모드로 호출되면 확인 프롬프트가 표시돼요. y, Y, <Enter> 또는 EOF 가 quit을 확인해요.

버전 3.14에서 변경: 디버거가 'inline' 모드로 호출되면 확인 프롬프트가 표시됨. 확인 후 디버거는 다음 trace 이벤트에서 bdb.BdbQuit을 발생시키는 대신 sys.exit()을 즉시 호출함.

debug code

code(현재 환경에서 실행할 임의의 표현식 또는 문)를 단계별로 실행하는 재귀 디버거에 들어가요.

retval

현재 함수의 마지막 반환에 대한 반환 값을 인쇄해요.

exceptions [excnumber]

연결된(chained) 예외를 나열하거나 그 사이를 이동해요. pdb.pm() 또는 Pdb.post_mortem(...)을 traceback 대신 연결된 예외와 함께 사용할 때, exceptions 명령으로 예외를 나열하고 exceptions <number>로 그 예외로 전환해 연결된 예외 사이를 이동할 수 있어요.

예:

def out():
    try:
        middle()
    except Exception as e:
        raise ValueError("reraise middle() error") from e

def middle():
    try:
        return inner(0)
    except Exception as e:
        raise ValueError("Middle fail")

def inner(x):
    1 / x

out()

pdb.pm()을 호출하면 예외 사이를 이동할 수 있어요:

> example.py(5)out()
-> raise ValueError("reraise middle() error") from e

(Pdb) exceptions
  0 ZeroDivisionError('division by zero')
  1 ValueError('Middle fail')
> 2 ValueError('reraise middle() error')

(Pdb) exceptions 0
> example.py(16)inner()
-> 1 / x

(Pdb) up
> example.py(10)middle()
-> return inner(0)

버전 3.13에 추가.

각주

[1] 프레임이 특정 모듈에서 시작된 것으로 간주되는지는 프레임 전역의 __name__에 의해 결정돼요.

더 알아보기

  • bdb — 기본 Python 디버거 백엔드.
  • cmd — 디버거 명령이 구축된 표준 라이브러리 모듈.
  • py_compile — pdb와 함께 사용할 수 있는 소스 파일 컴파일 유틸리티.
  • pdb (원문)