使用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對應的窗口輸入回車,繼續執行,就會斷到斷點所在的位置。