2016-08-11 67 views
16

我可以使用ddd -pydb prog.py來調試Python代碼。所有的python命令行參數也可以在prog.py之後傳遞。在我的情況下,許多類已經在C++中實現,使用boost-python暴露給python。我希望我可以一起調試Python代碼和C++。比如我要設置斷點這樣的:通過一起提升來調試Python和C++

break my_python.py:123 
break my_cpp.cpp:456 
cont 

當然我編譯C++代碼的調試選項後嘗試它,但不調試器不交叉升壓邊界。有什麼辦法嗎?

編輯: 我看到了http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/faq/how_do_i_debug_my_python_extensi.html。 我跟着它,我可以爲python和C++進行調試。但我最好想用DDD進行可視化調試,但我不知道如何在DDD內提供'target exec python'命令。如果不是的話(只要在鏈接中使用gdb),我應該能夠爲Python腳本進行調試,而不是交互地給出鏈接中的python命令。

+0

不完全是一個答案,但可能會給你一些想法:http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –

回答

7

我發現如何在運行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++設置斷點,並在每個窗口中使用其他調試功能(我希望在幾個月前我已經知道這個),它應該已經幫助了很多。

enter image description here

編輯:得到PID,你可以做ps -aux | grep python代替。這個pid是ddd的pid的下一個。

+0

pdb.set_trace()可能是一個更好的讓Python暫停的方式,但最終它們具有相同的效果。 – AndyG

+0

@AndyG啊,那也行。謝謝。 –

2

我有一個類似的問題,但沒有得到在Chan's answer工作的解決方案(在MAC OS X 10.12.4)。相反,以下爲我工作。

  1. 編寫一個導入並使用boost.Python模塊的python腳本test.py
  2. 開始蟒蛇在調試器

    lldb python3 test.py 
    

    > lldb python3 test.py 
    (lldb) target create "python3" 
    Current executable set to 'python3' (x86_64). 
    (lldb) settings set -- target.run-args "test.py" 
    (lldb) run 
    Process 46189 launched: '/Users/me/anaconda/bin/python3' (x86_64) 
    test.cpython-36m-darwin.so was compiled with optimization - stepping may behave oddly; variables may not be available. 
    Process 46189 stopped 
    * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10d4b3000) 
    frame #0: 0x00000001019f49c2 test.cpython-36m-darwin.so`std::__1::enable_if<true, void>::type (anonymous namespace)::Render2D<double>::add_particle<true, 5ul>(float*, float, float, float, float) const [inlined] mylib::SSE::packed<8ul, float>::loadu(
        944  { return {_mm256_load_ps(p)}; } 
        945  /// load from unaligned memory location 
        946  static __always__inline packed loadu(const element_type*p) noexcept 
    -> 947  { return {_mm256_loadu_ps(p)}; } 
        948  /// load from aligned memory location, using template arg for alignment 
        949  template<bool aligned> 
    
        950  static __always_inline enable_if_t< aligned, packed> 
    

無需獲得PID和一個單獨的窗口或設置任何斷點開始調試。