如何在gdb中的python函数上设置断点

ami*_*mit 6 python debugging gdb cpython

我有时使用gdb来调试python脚本(当然是CPython).通常调试核心转储(以及涉及c扩展模块时)非常有用.

一个基本问题是如何在gdb中的python函数上设置断点.假设我有一个带有foo函数的python脚本,我想在调用foo后立即中断.我想设置一个条件断点PyEval_EvalFrameEx可能会起作用,但不知道该怎么做.

Bre*_*itt 1

使用您建议的技术,这是可行的(尽管不太漂亮):

break PyEval_EvalFrameEx if (strcmp((((PyStringObject *)(f->f_code->co_name))->ob_sval), "foo") == 0)
Run Code Online (Sandbox Code Playgroud)

这里,f 是一个 PyFrameObject。您可能还需要检查f->f_code->co_filename以确保您拥有正确的文件。请注意,这确实会大大减慢程序速度,因为您要进行大量破坏和比较。

GDB 7 有一些很好的帮助宏来处理 CPython,但我不熟悉它们。可能有更好的方法来完成您正在寻找的东西。