有时我会使用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->f_code->co_filename
以确保您已经拿到了正确的文件。请注意,这会减慢程序的运行速度,因为您正在进行大量的中断和比较。