使用pdb与gdb调试TVM源码

使用pdb与gdb调试TVM源码

前言

TVM代码库的一个有趣的方面是c++和Python之间的互操作性不是单向的(python和C++的交互)。通常,所有执行重载的代码都是用c++实现的,并且为用户界面提供了Python绑定。在TVM中也是如此,但是在TVM代码库中,c++代码也调用Python模块中定义的函数。例如,用Python实现卷积运算符,它的实现是从Relay中的c++代码调用的。所以我们想要跟踪调试TVM的过程需要python和C++的联合调试工具。

使用pdb调试python程序

Pdb一般是随着python安装包进行安装的,如果使用pdb命令失败,可以重新安装python。
先说pdb的调试,pdb调试与gdb使用方式类似,都是使用pdb xxx.py进行。这个时候,程序会自动运行到程序的第一行。之后使用命令进行,网上相关的文档非常多,不再进行赘述。
这里介绍下python pdb特有的一种调试方法,在源码中可以使用

  1. import pdb
  2. pdb.set_trace()[有可能断不住]
  • 1
  • 2
  • 3 然后使用python xxx.py运行程序,程序会自动断在pdb.set_trace()那一行,从该起开始调试,这里仅作为介绍。但是本人的程序没停住。我用了设置断点行数的方法。
    下面介绍一些pdb里面会用到的命令: ``` 1.在pdb中断点到某一行: unt num_line eg:unt 42直接从当前位置运行到 42行 2. 更多命令参考:https://docs.python.org/3/library/pdb.html
  1. - 1
  2. - 2
  3. - 3
  4. - 4
  5. ## 使用gdb调试C
  6. ### gdb配置
  7. 由于进入的时候是python代码,因此想要使用gdb下断点非常困难。我们需要使用gdb附加进程的方式进行,但是这个过程需要root的支持。Ubuntu系统中没有root用户,所以需要下面命令来添加:

$ echo “0” | sudo tee /proc/sys/kernel/yama/ptrace_scope

  1. - 1
  2. 为了方便调试,需要在测试代码中加入下面代码来方便进行调试。

$ import os $ input(os.getpid())

  1. - 1
  2. - 2
  3. ### 调试过程
  4. - 使用命令运行程序

$ python gen_cuda.py 输出: 19143 //19143是运行该python程序时的pid

  1. - 1
  2. - 2
  3. - 在另一个窗口中使用gdb attachpid劫持python程序的进程

$ gdb attach 19143

  1. - 1
  2. - 然后对想要进行下断点的函数或者行进行下断点

$ (gdb) b tvm::codegen::CodeGenCUDA::PrintType 输出:Breakpoint 1 at 0x7f22ae4e9df0 (2 locations)

```

  • 1
  • 2

  • 在gdb所在的窗口使用c命令使程序执行起来
    (gdb) c
    Continuing.

  • 然后再python对应的窗口输入回车,继续执行,就会断到断点所在的位置。