2016-08-11 3 views
16

ddd -pydb prog.pyを使用してPythonコードをデバッグできます。すべてのPythonコマンドライン引数は、prog.pyのあとにも渡すことができます。私の場合、多くのクラスはC++で実装されており、boost-pythonを使ってPythonに公開されています。私はPythonコードとC++を一緒にデバッグできることを願っています。たとえば、私はこのようにブレークポイントを設定したい:もちろんデバッグPythonとC++は共にboostによって公開されます

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が表示され、キーボード入力を待つことになります。

のpythonストップコード:

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 

それとも、あなたは以下のコメント(感謝@AndyG)として輸入PDB、pdb.set_trace()を使用して、[編集]を見ることができます*。 ps -auxを使用してPIDを取得する。

ここで、C++共有ライブラリが_caffe.soであるとします(この_caffe.soライブラリはすべてのC++コードを持ち、Pythonラッパー関数を強化します)。 27352はpidです。その後

gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352 

か、DDDのように使用してグラフィカルなデバッグを使用したい場合は、

ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352 

を行うその後、あなたはgdbの開始を参照してプロンプトを待っていますように別のシェル開始GDBインチPythonプログラムはgdbによって中断され、停止モード(キー入力を待っていましたが、実際は停止モードです。
今(つまり、プログラムを保持していた)あなたは

br solver.cpp:225 

のようにgdbでのブレークポイントのコマンドを与えることができますし、第二のgdbのウィンドウにcontinueコマンドを与えるときあなたは

Breakpoint 1 at 0x7f2cccf70397: file src/caffe/solver.cpp, line 226. (2 locations) 

のようなメッセージを見ることができ、 Pythonコードが再び実行されます。もちろん、最初のgdbウィンドウにキー入力を与えて、それを進めるべきです。
少なくとも、Pythonプログラムを実行している間にC++コードをデバッグすることができます(これは私がやりたいことです)!

私はPythonとC++のデバッグを同時に行うことができるかどうかを後で確認して動作します。 ddd -pydb prog1.py options..のようなデバッガ(DDD)を起動し、上で説明した方法を使用して別のDDDを接続します。今では、PythonとC++のブレークポイントを設定したり、各ウィンドウで他のデバッグ関数を使用したりすることができます(私はこれを数ヶ月前に知りたがっています。

enter image description here

EDIT:PIDを取得するには、あなたの代わりにps -aux | grep pythonを行うことができます。このpidはdddのpidの次のものです。

+0

pdb.set_trace()はおそらく良いでしょうPythonを一時停止させる方法はありますが、最終的には同じ効果があります。 – AndyG

+0

@AndyGああ、あまりにも動作します。ありがとう。 –

2

私は同様の問題を抱えていましたが、(MAC OS X 10.12.4では)Chan's answerで解決策を得ることができませんでした。代わりに私のために働いた。

  1. boost.Pythonモジュールをインポートして使用するpythonスクリプト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を取得し、別のウィンドウまたは設定されたブレークポイントからデバッガを起動する必要はありませんを与えないデバッガ

lldb python3 test.py 

  • 開始パイソン。

  • 関連する問題