pdb — 파이썬 디버거
pdb — 파이썬 디버거
pdb 모듈은 파이썬 프로그램용 대화형 소스 코드 디버거를 정의해요. (조건부) 중단점 설정과 소스 줄 단위 단계 실행, 스택 프레임 검사, 소스 코드 나열, 어떤 스택 프레임의 문맥에서 임의의 파이썬 코드 평가를 지원해요. 사후(post-mortem) 디버깅도 지원하며 프로그램 제어 하에 호출할 수 있어요.
본문
디버거는 확장 가능해요 — 실제로는 Pdb 클래스로 정의돼요. 확장 인터페이스는 bdb 와 cmd 모듈을 사용해요. 관련 모듈로는 명시적 traceback 덤프용 faulthandler, 스택 트레이스 추출·포맷·출력용 traceback 이 있어요.
디버거에 진입하는 전형적인 방법은 원하는 위치에 다음을 넣는 거예요.
import pdb; pdb.set_trace()
또는:
breakpoint()
버전 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) 이고, 디버그 모드에 들어갔다는 표시예요.
버전 3.3부터 readline 모듈을 통한 탭 완성이 명령과 인자에 제공돼요.
커맨드라인 인터페이스 (Command-line interface)
다른 스크립트를 디버깅하려면 커맨드라인에서도 pdb 를 호출할 수 있어요.
python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]
- -c, --command
— .pdbrc파일에 준 것처럼 명령을 실행해요. - -m
— python -m처럼 모듈을 실행해요. - -p, --pid
— 지정한 PID 의 프로세스에 연결해요(버전 3.14 추가). 실행 중인 파이썬 프로세스에 원격 디버깅으로 연결하려면 python -m pdb -p 1234처럼 사용해요.
주요 함수
- pdb.run(statement, globals=None, locals=None) — statement(문자열 또는 코드 객체)를 디버거 제어 하에 실행해요. 코드가 실행되기 전에 디버거 프롬프트가 나타나요. 선택적 globals 와 locals 는 코드가 실행될 환경을 지정하며, 기본은
__main__모듈의 딕셔너리예요. - pdb.runeval(expression, globals=None, locals=None) — expression 을 디버거 제어 하에 평가하고 반환 시 그 값을 반환해요.
- **pdb.runcall(function, *args, kwds) — 주어진 인자로 function 을 호출해요. 함수가 진입하자마자 디버거 프롬프트가 나타나요.
- pdb.set_trace(, header=None, commands=None)* — 호출 스택 프레임에서 디버거에 진입해요. 코드가 디버깅되고 있지 않아도 특정 지점에 중단점을 하드코딩할 때 유용해요. header 가 주어지면 디버깅 시작 직전에 콘솔에 출력돼요. (버전 3.13부터 즉시 진입, 버전 3.14에서 commands 추가)
- awaitable pdb.set_trace_async(, header=None, commands=None)* —
set_trace()의 async 버전이에요. async 함수 안에서await와 함께 사용해야 해요. (버전 3.14 추가) - pdb.post_mortem(t=None) — 주어진 예외 또는 traceback 객체의 사후 디버깅에 진입해요. 값이 없으면 현재 처리 중인 예외를 사용하며 없으면
ValueError를 발생시켜요. - pdb.pm() —
sys.last_exc에서 찾은 예외의 사후 디버깅에 진입해요.
run* 함수들과 set_trace() 는 Pdb 클래스를 인스턴스화하고 같은 이름의 메서드를 호출하는 것의 별칭이에요.
Pdb 클래스
- class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False) — 디버거 클래스예요. skip 이 주어지면 그 glob 스타일 모듈 이름 패턴과 일치하는 모듈의 프레임으로는 단계하지 않아요. nosigint 가 true 면 SIGINT 핸들러를 건드리지 않아요. readrc 는
.pdbrc파일 로딩 여부를 제어해요.
주요 디버거 명령
- !(statement) — 현재 스택 프레임의 문맥에서 (한 줄) 문을 실행해요.
- restart [args ...] / run — 디버깅 중인 파이썬 프로그램을 다시 시작해요. 히스토리, 중단점, 동작, 디버거 옵션이 보존돼요.
- q(uit) — 디버거를 종료해요. 실행 중인 프로그램은 중단돼요.
- debug code — code 를 단계 실행하는 재귀 디버거에 진입해요.
- retval — 현재 함수의 마지막 반환 값 리턴값을 출력해요.
- exceptions [excnumber] — 체이닝된 예외들을 나열하거나 그 사이를 이동해요.