如何在gdb中为Python函数设置断点

6

有时我会使用gdb来调试Python脚本(当然是CPython)。这通常用于调试核心转储(以及涉及C扩展模块的情况)。

一个基本问题是如何在gdb中为Python函数设置断点。比如说,我有一个包含函数foo的Python脚本,我想在foo被调用后立即中断。我猜在PyEval_EvalFrameEx上设置一个条件断点可能有效,但不确定该如何操作。

1个回答

1

使用您建议的技术,这个可以工作(虽然不太美观):

break PyEval_EvalFrameEx if (strcmp((((PyStringObject *)(f->f_code->co_name))->ob_sval), "foo") == 0)

这里,f是一个PyFrameObject。您可能还想检查f->f_code->co_filename以确保您已经拿到了正确的文件。请注意,这会减慢程序的运行速度,因为您正在进行大量的中断和比较。
GDB 7有一些很好的帮助宏来处理CPython,但我不熟悉它们。使用这些宏可能有更好的方法来完成您要查找的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接