使用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特有的一种调试方法,在源码中可以使用
import pdb
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
- 2
- 3
- 4
## 使用gdb调试C
### gdb配置
由于进入的时候是python代码,因此想要使用gdb下断点非常困难。我们需要使用gdb附加进程的方式进行,但是这个过程需要root的支持。Ubuntu系统中没有root用户,所以需要下面命令来添加:
$ echo “0” | sudo tee /proc/sys/kernel/yama/ptrace_scope
- 1
为了方便调试,需要在测试代码中加入下面代码来方便进行调试。
$ import os $ input(os.getpid())
- 1
- 2
### 调试过程
- 使用命令运行程序
$ python gen_cuda.py 输出: 19143 //19143是运行该python程序时的pid
- 1
- 2
- 在另一个窗口中使用gdb attach该pid劫持python程序的进程
$ gdb attach 19143
- 1
- 然后对想要进行下断点的函数或者行进行下断点
$ (gdb) b tvm::codegen::CodeGenCUDA::PrintType 输出:Breakpoint 1 at 0x7f22ae4e9df0 (2 locations)
```
- 1
2
在gdb所在的窗口使用c命令使程序执行起来
(gdb) c
Continuing.- 然后再python对应的窗口输入回车,继续执行,就会断到断点所在的位置。