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