GDB 지원

페이지 이동됨

GDB를 사용한 CPython 디버깅에 관한 정보는 C 확장 모듈과도 관련이 있으므로 이제 메인 Python 문서에 있습니다. 먼저 이 문서를 읽으십시오: Debugging C API extensions and CPython Internals with GDB

CPython 팁

이 문서에는 CPython 내부를 디버깅할 때 특히 유용한 몇 가지 추가 팁이 있습니다.

레이블에서 중단하기

중단점은 대개 함수의 시작 부분에 설정하지만, 런타임 가상 머신을 디버깅할 때는 이 방법이 그다지 유용하지 않습니다. 메인 인터프리터 루프 함수인 _PyEval_EvalFrameDefault가 Python 3.12 기준으로 4,000줄을 훨씬 넘기 때문입니다. 다행히도 중단점을 설정하는 여러 방법 가운데에는 계산된 goto(computed goto)를 위해 생성되는 레이블과 같은 C 레이블에서 중단하는 방법이 있습니다. 계산된 goto 지원으로 컴파일된 인터프리터를 디버깅하고 있다면(일반적으로 그렇고, GCC를 사용할 때는 확실히 그렇습니다), 각 명령어 앞에는 TARGET_<instruction>이라는 이름의 레이블이 붙습니다. 예를 들면 TARGET_LOAD_CONST입니다. 그러면 다음과 같은 명령으로 중단점을 설정할 수 있습니다:

(gdb) break ceval.c:_PyEval_EvalFrameDefault:TARGET_LOAD_CONST

명령을 추가하고 파일에 저장한 다음, 개별 명령어의 시작 줄 번호가 시간이 지나면서 바뀌는 것을 걱정하지 않고 이후 세션에서 다시 불러오십시오.

중단점 저장 및 불러오기

Python 런타임의 특정 부분을 오랫동안 다루다 보면, 자주 쓰는 중단점 묶음과 해당 중단점에 도달했을 때 실행할 명령을 정의해 두는 것이 도움이 될 수 있습니다. 편의를 위해 save breakpoints 명령으로 중단점을 파일에 저장하고 이후 세션에서 불러오십시오:

(gdb) save breakpoints python.brk

파일을 원하는 대로 편집한 다음, 나중 세션에서 불러올 수 있습니다:

(gdb) source python.brk