使用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()

然后使用python xxx.py运行程序,程序会自动断在pdb.set_trace()那一行,从该起开始调试,这里仅作为介绍。

使用gdb调试C

gdb配置

由于进入的时候是python代码,因此想要使用gdb下断点非常困难。我们需要使用gdb附加进程的方式进行,但是这个过程需要root的支持。Ubuntu系统中没有root用户,所以需要下面命令来添加:

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

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

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

调试过程

  • 使用命令运行程序
$  python gen_cuda.py 
   输出: 19143   //19143是运行该python程序时的pid
  • 在另一个窗口中使用gdb attach该pid劫持python程序的进程
   $ gdb attach 19143
  • 然后对想要进行下断点的函数或者行进行下断点
 $  (gdb) b tvm::codegen::CodeGenCUDA::PrintType
   输出:Breakpoint 1 at 0x7f22ae4e9df0 (2 locations)
  • 在gdb所在的窗口使用c命令使程序执行起来
    (gdb) c
    Continuing.
  • 然后再python对应的窗口输入回车,继续执行,就会断到断点所在的位置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章