使用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對應的窗口輸入回車,繼續執行,就會斷到斷點所在的位置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章