python中斷點除錯模組pdb從入門到實戰
阿新 • • 發佈:2018-12-31
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]
命令檢視具體命令的用法簡介
- EOF 檔案結束標識
- a(args) 列印當前函式的所有引數
- 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])
- b(break) 檢視、新增斷點
b 列出當前所有斷點,和斷點執行到統計次數
b line_no:當前指令碼的line_no行新增斷點
b filename:line_no:指令碼filename的line_no行新增斷點
b function:在函式function的第一條可執行語句處新增斷點
- bt(w/where) 列印當前執行堆疊
- c(cont[inue]) 執行到下一個斷點
- cl(clear) 清除斷點
cl 清除所有斷點
cl bpnumber1 bpnumber2... 清除斷點號為bpnumber1,bpnumber2...的斷點
cl lineno 清除當前指令碼lineno行的斷點
cl filename:line_no 清除指令碼filename的line_no行的斷點
- commands 斷點處新增命令
- condition 設定條件斷點,當boolean為True時,條件斷點生效
condition bpnumber boolean
- debug 重啟debug,相當於restart
- disable 禁用斷點,可以恢復
- display [expression] 有引數表示式時,顯示錶達式的值;無引數時,顯示所有display過的值
- d(down) [count] 執行跳轉到在當前堆疊的深一層(個人沒覺得有什麼用處)
- enable 恢復斷點
- exit 退出除錯,程式中止
- h(help) [command] 查詢命令幫助,無引數時,列出所有pdb命令
- ignore bpnumber [count] 忽略斷點count次,預設為0,每執行一次,count減1
- interact 開啟一個全域性直譯器,其全域性名稱空間包含當前範圍的(全域性與區域性)的名稱
- j(jump) lineno 設定下條執行的語句函式,只能在堆疊的最底層跳轉,向後重新執行,向前可直接執行到行號
- l(list) [first [,last] | .] 顯示當前行後面的程式碼,預設顯示11行;引數為first時,顯示first後面11行;引數為.時,當前行前後分別顯示11行;當引數為first, last時,從first行顯示到last行,如果first > last時,在first後顯示last數量行
- ll(longlist) 顯示當前函式或程式碼塊的所有程式碼
- n(next) 執行當前行,游標跳轉到下一行
- p(pp) expression 打印表達式的值,pp會格式化列印的結果,與display的區別是:display會把表示式也打印出來,但p與pp只打印結果
- q(quit) 停止debug,程式執行中止
- r(return) 繼續執行函式,一直到return語句
- restart(run) [args…] 重啟當前除錯的程式
- rv(retval) 列印函式最後一次返回的值
- s(step) 執行到下一行,當前行為函式的呼叫,進行到函式定義的第一行
- source expression 獲取expression(module, class, method, function, traceback, frame, or code object)的原始碼
- tbreak[ ([filename:]lineno | function) [, condition] ] 設定臨時斷點或臨時條件斷點(只第一次生效)
- u(up) [count] 運行當前程式碼塊到上面一級,預設count=1,即執行到函式呼叫處
- unalias name 刪除別名
- undisplay [expression] 不再顯示expression,預設不顯示所有的expression
- unt(until) [lineno] 一直執行到行號處,預設執行到return處
- whatis arg 列印arg的變數型別