调试 TensorFlow 测试:pdb 还是 gdb?

Debugging TensorFlow tests: pdb or gdb?

我正在从 TensorFlow 调试 decode_raw_op_test。测试文件是用 python 编写的,但是它执行来自底层 C++ 文件的代码。

使用 pdb,我可以调试 python 测试文件,但它无法识别 c++ 文件。有没有一种方法可以调试底层 C++ 代码?

(我尝试在 decode_raw_op_test 上使用 gdb 但它给出了 "File not in executable format: File format not recognized")

调试混合 Python 和 C++ 程序很棘手。但是,您可以使用 gdb 来调试 TensorFlow 的 C++ 部分。有两种主要方法可以做到这一点:

  1. 运行 pythongdb 下,而不是测试脚本本身。假设您的测试脚本在 bazel-bin/tensorflow/python/kernel_tests/decode_raw_op_test 中。您将 运行 以下命令:

    $ gdb python bazel-bin/tensorflow/python/kernel_tests/decode_raw_op_test
    (gdb) run
    

    请注意,gdb 对调试代码的 Python 部分没有很好的支持。我建议缩小您 运行 单个简单测试的测试用例,并在 TensorFlow C API 方法上设置断点,例如 TF_Run,这是主要条目在 TensorFlow 中从 Python 指向 C++。

  2. gdb 附加到 运行ning 进程。您可以使用 ps 获取 Python 测试的进程 ID,然后使用 运行(其中 $PID 是进程 ID):

    $ gdb -p $PID
    

    您可能需要安排 Python 代码阻塞,以便有时间附加。调用 raw_input() 函数是一种简单的方法。

可以使用以下步骤进行调试:

gdb python

然后在 gdb 提示符下,键入

run bazel-bin/tensorflow/python/kernel_tests/decode_raw_op_test

加上mrry的回答,在今天的TF2环境下,主入口点应该是TFE_Execute,这应该是你添加断点的地方。