我发现了如何在运行 python 时调试 C++ 部分。(在阅读 Python 书籍中的进程 ID 检测时意识到这一点。)。
首先,您运行包含 C++ 程序的 python 程序。在 python 程序开始时,使用 raw_input() 让程序等待你输入。但就在那之前print os.getpid()
(当然你应该已经导入了 os 包)。当你运行 python 程序时,它会打印你正在运行的 python 程序的 pid,并等待你的键盘输入。
蟒蛇停止代码:
import os
def w1(str):
print (str)
wait = raw_input()
return
print os.getpid()
w1('starting main..press a key')
结果 :
27352
starting main..press a key
或者,您可以使用 import pdb, pdb.set_trace() 作为下面的评论。(感谢@AndyG)并查看 EDIT* 以使用ps -aux
.
现在,假设 C++ 共享库是 _caffe.so(这是我的情况。这个 _caffe.so 库包含所有 C++ 代码和 boost python 包装函数)。27352 是 pid。然后在另一个shell中启动gdb,如
gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352
或者,如果您想使用 DDD 之类的图形调试,请执行
ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352
然后你会看到 gdb 启动并等待提示。python 程序被 gdb 中断并在停止模式下等待(它正在等待您的键输入,但现在它实际上处于停止模式,并且它需要来自第二个调试器的 gdb continue 命令才能继续键等待)。
现在你可以在 gdb 中给出断点命令,比如
br solver.cpp:225
你可以看到像这样的消息
Breakpoint 1 at 0x7f2cccf70397: file src/caffe/solver.cpp, line 226. (2 locations)
当您continue
在第二个 gdb 窗口(保存程序)中发出命令时,python 代码再次运行。当然,您应该在第一个 gdb 窗口中输入一个键以使其继续。
现在至少您可以在运行 python 程序的同时调试 C++ 代码(这就是我想要做的)!
后来我检查了我是否可以同时进行 python 和 C++ 调试并且它可以工作。您启动调试器(DDD),ddd -pydb prog1.py options..
并使用上述方法附加另一个 DDD。现在您可以为 python 和 C++ 设置断点,并在每个窗口中使用其他调试功能(我希望我在几个月前就知道这一点。它应该有帮助。)。
编辑:要获得 pid,您可以这样做ps -aux | grep python
。这个 pid 是 ddd 的下一个 pid。