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