【问题标题】:debugging Tensorflow's C++ code behind the SWIG interface在 SWIG 接口后面调试 Tensorflow 的 C++ 代码
【发布时间】:2020-03-12 15:32:49
【问题描述】:

我不确定如何调试(可能是使用 GDB)SWIG 接口后面的 Python 代码。

我可以使用ipdb 来观察 Tensorflow 的 Python 代码一直到 SWIG 包装器的执行情况(例如,session.py 中的tf_session.TF_Run),但我想调试 SWIG 接口后面的 C++ 代码。

大概我用bazel build --config debug 构建了Tensorflow,但是当从Python 接口调用时,如何将gdb 附加到生成的代码中?

【问题讨论】:

    标签: debugging tensorflow


    【解决方案1】:

    TensorFlow 的 C++ 代码与调用它的 Python 代码在同一进程中执行(或者,如果您使用分布式版本,则与创建 tf.GrpcServer 的 Python 程序之一在同一进程中)。

    Python 和 C++ 之间最简单的接口是 tensor_c_api.h 中的纯 C API。要拦截其中一个调用,您可以将 gdb 附加到运行 TensorFlow 的 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 运行, you may need to try this.
    • 我按照步骤操作,当我创建一个新会话时,创建刚刚完成,没有中断。@mrry 然后我发现现在 python 使用 TF_NewDeprecatedSession 而不是 TF_NewSession。现在问题解决了。谢谢!
    猜你喜欢
    • 2017-05-03
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多