GDB 支持

页面已移动

有关使用 GDB 调试 CPython 的信息现已包含在 Python 主文档中,因为它也与 C 扩展模块相关。请先阅读以下内容:使用 GDB 调试 C API 扩展和 CPython 内部

CPython 提示

本文档包含一些其他提示,专门用于调试 CPython 内部。

在标签处中断

你通常会在函数开头设置断点,但这种方法在调试运行时虚拟机时不太有用,因为主解释器循环函数 _PyEval_EvalFrameDefault 在 Python 3.12 中有 4,000 多行。幸运的是,在 设置断点的多种方法 中,你可以在 C 标签处中断,例如为计算的 goto 生成的标签。如果你正在调试使用计算 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