我發現如何在運行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
或者,你可以使用進口PDB,pdb.set_trace()作爲下面的評論(感謝@AndyG),看看編輯*使用ps -aux
來獲得pid。 (這是我的情況,這個_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)
當你給在第二GDB窗口continue
命令(即抱着程序), python代碼再次運行。當然,您應該在第一個gdb窗口中輸入一個鍵輸入,以使其繼續。
現在至少你可以在運行python程序時調試C++代碼(這就是我想要做的)!
我後來檢查,如果我可以在同一時間做python和C++調試,它的工作原理。您啓動調試器(DDD),如ddd -pydb prog1.py options..
,並使用上述方法連接另一個DDD。現在你可以爲python和C++設置斷點,並在每個窗口中使用其他調試功能(我希望在幾個月前我已經知道這個),它應該已經幫助了很多。
編輯:得到PID,你可以做ps -aux | grep python
代替。這個pid是ddd的pid的下一個。
不完全是一個答案,但可能會給你一些想法:http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –