我有时使用 gdb 来调试 python 脚本(当然是 CPython)。它通常用于调试核心转储(以及当它涉及 c 扩展模块时)。
一个基本问题是如何在 gdb 中的 python 函数上设置断点。假设我有一个带有函数 foo 的 python 脚本,我想在调用 foo 后立即中断。我想设置一个条件断点PyEval_EvalFrameEx
可能会起作用,但不知道该怎么做。
使用您建议的技术,这可行(尽管它并不漂亮):
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,但我不熟悉它们。可能有更好的方法来完成你正在寻找的那些。