The Python Debugger Pdb
能夠直接在命令行中啓動,調試程序
也能夠寫在代碼中html
能夠直接在命令行指定要進行調試的程序python
python -m pdb my_test.py
以後會顯示當前代碼執行的位置
經過輸入命令進行操做express
命令 | 做用 |
---|---|
h(elp) | 幫助 |
w(here) | 打印當前堆棧 |
d(own)[count] | 執行跳轉到當前堆棧的深 [count] 層,默認爲 1 |
u(p) | 執行跳轉到當前堆棧的上 [count] 層,默認爲 1 |
b(reak)[ ([filename:]lineno | function) [, condition] ] | 不加參數:列出全部斷點; 指定行號:(能夠指定其餘文件的一行) 在當前行添加斷點; 指定函數:在函數的第一個可執行語句添加斷點; 指定條件:當條件語句知足時斷點生效 |
tbreak[ ([filename:]lineno | function) [, condition] ] | 臨時斷點,生效一次後自動刪除,使用方法同 b(reak) |
cl(ear) | 不加參數:清除全部斷點; 指定行號:(能夠指定其餘文件的一行) 清除當前行斷點; 指定斷點號:清除此斷點 |
disable bpnumber [bpnumber ...] | 停用斷點 |
enable bpnumber [bpnumber ...] | 激活斷點 |
condition bpnumber [condition] | 爲此斷點設定條件 |
s(tep) | 執行下一條命令,若是是函數調用,就執行到調用函數的第一句(會進入到調用的函數內部) |
n(ext) | 執行下一條語句,若是是函數調用,就執行函數,以後執行下一條語句(不會進入調用的函數內部) |
unt(il) [lineno] | 不帶參數的狀況下,繼續執行,直到到達行號大於當前行的行號爲止。使用[lineno],繼續執行直到行號大於或等於[lineno]。 |
r(eturn) | 繼續執行,直至當前函數 return |
retval | 打印函數最後一次的返回值 |
run [args...] | 從新啓動程序,至關於restart |
c(ont(inue)) | 繼續執行,直至遇到斷點 |
l(ist) | 列出當前語句周圍 11 行的源碼。 若是有一個參數,列出該行號周圍 11 行的源碼。 若是有兩個參數,列出區間內的源碼。 若是有兩個參數,且後面的小,前面的參數爲行號,後面參數爲列出源碼的行數。 |
longlist | ll | 列出當前函數的所有源碼 |
a(rgs) | 列出當前函數的全部參數 |
whatis arg | 打印參數類型 |
p expression | 輸出 expression 的值 |
pp expression | 好看一點地輸出 expression 的值 |
q(uit) exit | 退出 debugger 中止執行語句 |
set_trace() 是最經常使用的斷點方式,放置在代碼中,程序會停在斷點處,輸入命令 c
繼續運行函數
示例:ui
import pdb def main(i): for i in range(i): pdb.set_trace() print(i) if __name__ == '__main__': main(10)
輸出:命令行
> /dir/test.py(7)main() -> print(i) (Pdb)
表示執行到 /dir/test.py
的第 7 行,main()
函數中,語句爲 print(i)
debug
Python 3 中加入了內置函數 breakpoint()
能夠直接調用 pdb,至關於 pdb.set_trace()
調試
會在當前位置打斷點,接下來會執行字符串類型的表達式rest
run(cmd, globals=None, locals=None) 會對傳入的參數執行 exec()
runeval(expr, globals=None, locals=None) 會對傳入的參數執行 eval()
code
若是不傳入參數,則默認使用全局變量(__main__.dict
) 若是要傳入參數就要將所有參數以字典形式傳入,使用沒有傳入的參數會報錯