Debugging 调试Tensorflow';s C++;SWIG接口后面的代码

Debugging 调试Tensorflow';s C++;SWIG接口后面的代码,debugging,tensorflow,Debugging,Tensorflow,我不知道如何调试(大概是使用GDB)SWIG接口后面的Python代码 我可以使用 IPDB < />代码来观察Tensorflow Python代码的执行方式,直到SWIG包装器(例如:代码> TfSession。TfyRun < /C> > session .py/,但是我想调试SWIG接口后面的C++代码。< /P> 大概是用 BZEL Bug——配置调试< /C> >来构建Tensorflow,但是当从Python接口调用时,我如何将代码> GDB < /代码>附加到结果代码?< Te

我不知道如何调试(大概是使用GDB)SWIG接口后面的Python代码

我可以使用 IPDB < />代码来观察Tensorflow Python代码的执行方式,直到SWIG包装器(例如:代码> TfSession。TfyRun < /C> > <代码> session .py/<代码>,但是我想调试SWIG接口后面的C++代码。< /P>

大概是用<代码> BZEL Bug——配置调试< /C> >来构建Tensorflow,但是当从Python接口调用时,我如何将代码> GDB < /代码>附加到结果代码?< TensorFlow >的C++代码在与调用它的Python代码相同的进程中执行。(或者,如果您使用的是分布式版本,则与创建

tf.GrpcServer
的Python程序的过程相同)

介于Python和C++之间最简单的接口是PURE C API。为了拦截这些调用中的一个,可以将代码> GDB < /代码>附加到正在运行TysOracle的Python解释器的进程ID上,并在这些函数之一上创建断点。 例如,使用交互式Python会话,在第一个终端中输入:

$ python
>>> import tensorflow
>>> import os
>>> os.getpid()
14680
然后,在另一个终端中,启动
gdb

$ gdb -p 14680
[...]
(gdb) break TF_NewSession
Breakpoint 1 at 0x7f15f450a4d0
(gdb) continue
Continuing.
回到Python解释器中,创建一个新会话:

>>> sess = tf.Session()
解释器将暂停,调试器将打印如下内容:

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 ()
[...]

现在,您可以使用
gdb
的全部功能调试TensorFlow。

作为后续操作:如果有人在Ubuntu上运行,即使它使用相同的
uid
运行,它也不会让您连接到进程。我按照步骤进行了操作,当我创建一个新会话时,创建过程刚刚完成,没有中断。@mrry然后我发现现在python使用TF_NewDeprecatedSession而不是TF_NewSession。现在问题解决了。thks!