1. 程式人生 > >python中斷點除錯模組pdb從入門到實戰

python中斷點除錯模組pdb從入門到實戰

python模組簡介

在使用jupyter book、ipyhton或執行命令列時,通常會遇到除錯很不方便的情況。還好Python有自帶的pdb庫,發現用pdb來除錯程式還是很方便的,當然了,什麼遠端除錯,多執行緒之類,pdb是搞不定的

pdb模組使用的三種方式

1. 命令列模式
     命令列啟動目標程式,加上-m引數,這樣呼叫myscript.py的話,斷點就是程式的執行第一行之前,常見操作如下

python -m pdb myscript.py
- 輸入next執行到下一行
- 輸入list顯示下面11行程式碼
- 輸入p列印變數
- 輸入quit結束除錯

2. 在Python互動環境中啟用除錯

import pdb
import mymodule

pdb.run("mymodule.test()")

3. 程式內部插入斷點
比較常用的,就是在程式中間插入一段程式,相對於在一般IDE裡面**打上斷點(pdb.set_trace()後一行)**然後啟動debug,不過這種方式是hardcode的,適合於用在IDE不好直接除錯的情況

if __name__ == "__main__":
    a = 1
    import pdb
    pdb.set_trace()
    b = 2
    c = a + b
    print(c)

pdb模組的常用引數

在進入pdb除錯環境時,可以同過help命令檢視所有pdb模組的所有命令,也可以通過help [command]命令檢視具體命令的用法簡介

  1. EOF      檔案結束標識
  2. a(args)      列印當前函式的所有引數
  3. alias      alias [name [command [parameter parameter ...] ]]
         alias      檢視所有別名
         alias name      檢視別名name

         alias name command [parameter parameter …]      定義別名name
             eg.alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
  4. b(break)      檢視、新增斷點
b 列出當前所有斷點,和斷點執行到統計次數
b line_no:當前指令碼的line_no行新增斷點
b filename:line_no:指令碼filename的line_no行新增斷點
b function:在函式function的第一條可執行語句處新增斷點
  1. bt(w/where)      列印當前執行堆疊
  2. c(cont[inue])      執行到下一個斷點
  3. cl(clear)      清除斷點
cl 清除所有斷點
cl bpnumber1 bpnumber2... 清除斷點號為bpnumber1,bpnumber2...的斷點
cl lineno 清除當前指令碼lineno行的斷點
cl filename:line_no 清除指令碼filename的line_no行的斷點
  1. commands      斷點處新增命令
  2. condition      設定條件斷點,當boolean為True時,條件斷點生效      condition bpnumber boolean
  3. debug      重啟debug,相當於restart
  4. disable      禁用斷點,可以恢復
  5. display [expression]      有引數表示式時,顯示錶達式的值;無引數時,顯示所有display過的值
  6. d(down) [count]      執行跳轉到在當前堆疊的深一層(個人沒覺得有什麼用處)
  7. enable      恢復斷點
  8. exit      退出除錯,程式中止
  9. h(help) [command]      查詢命令幫助,無引數時,列出所有pdb命令
  10. ignore bpnumber [count]      忽略斷點count次,預設為0,每執行一次,count減1
  11. interact      開啟一個全域性直譯器,其全域性名稱空間包含當前範圍的(全域性與區域性)的名稱
  12. j(jump) lineno      設定下條執行的語句函式,只能在堆疊的最底層跳轉,向後重新執行,向前可直接執行到行號
  13. l(list) [first [,last] | .]      顯示當前行後面的程式碼,預設顯示11行;引數為first時,顯示first後面11行;引數為.時,當前行前後分別顯示11行;當引數為first, last時,從first行顯示到last行,如果first > last時,在first後顯示last數量行
  14. ll(longlist)      顯示當前函式或程式碼塊的所有程式碼
  15. n(next)      執行當前行,游標跳轉到下一行
  16. p(pp) expression      打印表達式的值,pp會格式化列印的結果,與display的區別是:display會把表示式也打印出來,但p與pp只打印結果
  17. q(quit)      停止debug,程式執行中止
  18. r(return)      繼續執行函式,一直到return語句
  19. restart(run) [args…]      重啟當前除錯的程式
  20. rv(retval)      列印函式最後一次返回的值
  21. s(step)      執行到下一行,當前行為函式的呼叫,進行到函式定義的第一行
  22. source expression      獲取expression(module, class, method, function, traceback, frame, or code object)的原始碼
  23. tbreak[ ([filename:]lineno | function) [, condition] ]      設定臨時斷點或臨時條件斷點(只第一次生效)
  24. u(up) [count]      運行當前程式碼塊到上面一級,預設count=1,即執行到函式呼叫處
  25. unalias name      刪除別名
  26. undisplay [expression]      不再顯示expression,預設不顯示所有的expression
  27. unt(until) [lineno]      一直執行到行號處,預設執行到return處
  28. whatis arg      列印arg的變數型別