2016-04-04 3 views
7

SWIGインタフェースの背後にあるPythonコードを(おそらくGDBで)デバッグする方法がわかりません。SWIGインタフェースの背後にあるTensorflowのC++コード

私はすべての方法SWIGラッパー(session.pyで例えばtf_session.TF_Run)にTensorflowのPythonコードの実行を監視するipdbを使用することができますが、私はSWIGインタフェースの背後にあるC++コードをデバッグしたいと思います。

おそらく私はbazel build --config debugでTensorflowを構築しますが、Pythonインターフェイスから呼び出されたときに結果のコードにgdbを添付するにはどうすればよいですか?

答えて

13

TensorFlowのC++コードは、それを呼び出すPythonコードと同じプロセスで実行されます(または、分散バージョンを使用している場合は、tf.GrpcServerを作成したPythonプログラムの1つと同じプロセスで実行されます)。

PythonとC++の最も簡単なインターフェイスは、pure-C APIのtensor_c_api.hです。これらの呼び出しの1つをインターセプトするには、TensorFlowを実行しているPythonインタプリタのプロセスIDにgdbを添付し、これらの関数のいずれかにブレークポイントを作成します。インタラクティブPythonのセッションを使用して、例えば

、第1の端子に入力:

$ python 
>>> import tensorflow 
>>> import os 
>>> os.getpid() 
14680 

そして、他の端末では、gdbを開始:

戻るPythonのインタープリターで
$ gdb -p 14680 
[...] 
(gdb) break TF_NewSession 
Breakpoint 1 at 0x7f15f450a4d0 
(gdb) continue 
Continuing. 

、作成新しいセッション:

>>> sess = tf.Session() 

インタープリタが一時停止し、あなたのdeb

Breakpoint 1, 0x00007f15f450a4d0 in TF_NewSession() from [...]/tensorflow/python/_pywrap_tensorflow.so 
(gdb) backtrace 
#0 0x00007f15f450a4d0 in TF_NewSession() from [...]/tensorflow/python/_pywrap_tensorflow.so 
#1 0x00007f15f3ac5cdb in _wrap_TF_NewSession() from [...]/tensorflow/python/_pywrap_tensorflow.so 
#2 0x000000000049968d in PyEval_EvalFrameEx() 
#3 0x00000000004a090c in PyEval_EvalCodeEx() 
#4 0x0000000000499a52 in PyEval_EvalFrameEx() 
[...] 

あなたは今TensorFlowをデバッグするgdbのフルパワーを使用することができます。uggerは、次のようなものを出力します。

+4

誰かがUbuntuで動作していて、同じuid'_で動作していてもプロセスにアタッチできない場合は、[これを試す必要があります](http: //askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process)。 –

+0

私はこの手順に従いました。新しいセッションを作成すると、作成は途切れることなく完了しました。@ mrry次に、PythonはTF_NewSessionの代わりにTF_NewDeprecatedSessionを使用します。今問題は解決されています。すごい! –

関連する問題