一、PDB調試命令
完整命令 | 簡寫命令 | 描述 |
args | a | 列出當前函數的參數 |
break | b <行號> | 在某一行設置斷點 |
break | b <文件名>:<行號> | 在某個文件的某行打一點斷點 |
break | b <函數名> | 在某個含稅的第一行打一個斷點 |
clear | cl | 清除所有斷點 |
clear | cl n1 n2 | 清除編號為n1、n2的斷點 |
condition | 無 | 設置條件斷點 |
disable | 無 | 禁用斷點 |
enable | 無 | 啟用斷點 |
help | h | 查看pdb幫助 |
next | n | 執行下一條語句,遇到函數不進入其內部 |
step | s | 執行下一條語句,遇到函數會進入其內部 |
continue | c或者cont | 執行到下一個斷點 |
ignore | 無 | 忽略斷點 |
jump | j | 跳轉到指定行數運行 |
list | l | 列出源碼(前后11行代碼) |
list | l <行號> | 列出某行周圍11行代碼(即這一行為中間行,列出它上下各5行) |
list | l <行號1> <行號2> | 列出兩個行號范圍內的代碼 |
p | p | 打印變量值,也可以用print |
pp | pp | 好看一點的輸出 |
quit | q | 退出 pdb |
return | r | 一直運行到函數返回 |
tbreak | 無 | 設置臨時斷點,斷點只中斷一次 |
where | w | 打印當前執行堆棧(查看所在的位置) |
! | 無 | 在pdb中執行語句 |
二、關鍵命令
1.斷點設置 (Pdb) b 10 # 斷點設置在本py的第10行 (Pdb) b test.py:20 # 斷點設置到 test.py第20行 2.刪除斷點 (Pdb) b # 查看斷點編號 (Pdb) cl 2 # 刪除第2個斷點 3.運行 (Pdb) n # 單步運行 (Pdb) s # 細點運行 也就是遇到函數、方法會進入里面 (Pdb) c # 跳到下個斷點 4.查看 (Pdb) p param # 查看當前 變量值 (Pdb) l # 查看運行到某處代碼 (Pdb) a # 查看全部棧內變量 5.打印變量 (Pdb)p param # 如果變量是個復雜的對象,可以先打印查看變量的屬性,然后查看變量的某個屬性值 (Pdb)p dir(param) (Pdb)p param.xxx
三、調試示例
1、示例1
1.代碼示例 import pdb s1 = 'aaa' pdb.set_trace() s2 = 'bbb' s3 = 'ccc' pdb.set_trace() s = s1 + s2 + s3 print(s) 可以看到上面代碼使用pdb.set_trace()函數打了兩個斷點(第4、7行) 2.開始調試 執行上面代碼就進入了調試狀態: > d:\projects\pythonprojects\3.25pdb\test.py(4)<module>() -> s2 = 'bbb' # -> 表示執行到了這里,但是還沒有真正執行,因此此時的s2仍未被賦值 (Pdb) 可以看出直接執行到了第一個斷點所在的下一行,並停在了這里。 這時可以執行命令: n 進行下一步: (Pdb) n > d:\projects\pythonprojects\3.25pdb\test.py(5)<module>() -> s3 = 'ccc' # -> 表示執行到了這里,但是還沒有真正執行,因此此時的s3仍未被賦值,但前面的代碼都執行了 (Pdb) 使用 p <變量名> 命令打印已經出現過的變量的值: (Pdb) p s1 'aaa' (Pdb) p s2 'bbb' (Pdb) p s3 *** NameError: name 's3' is not defined (Pdb) 因為當前變量s3還沒有被賦值,所以打印s3的時候提示 NameError 異常。 使用 l 命令打印出當前的代碼段: (Pdb) l 1 import pdb 2 s1 = 'aaa' 3 pdb.set_trace() 4 s2 = 'bbb' 5 -> s3 = 'ccc' 6 pdb.set_trace() 7 s = s1 + s2 + s3 8 print(s) 退出調試: q 命令 Traceback (most recent call last): File "D:/Projects/PythonProjects/3.25pdb/test.py", line 5, in <module> s3 = 'ccc' File "D:/Projects/PythonProjects/3.25pdb/test.py", line 5, in <module> s3 = 'ccc' File "C:\Python\Python36\lib\bdb.py", line 51, in trace_dispatch return self.dispatch_line(frame) File "C:\Python\Python36\lib\bdb.py", line 70, in dispatch_line if self.quitting: raise BdbQuit bdb.BdbQuit
2、示例2
QuickStart中使用的調試方式不夠優雅,因為是通過修改代碼的方式打斷點的,用起來不太方便。
那么下面我們使用動態打斷點的方式進行調試
1.代碼示例 s1 = 'aaa' s2 = 'bbb' s3 = 'ccc' s = s1 + s2 + s3 print(s) 2.開始調試 1,在終端輸入命令執行腳本文件:python -m pdb test2.py > d:\projects\pythonprojects\3.25pdb\test2.py(1)<module>() -> s1 = 'aaa' (Pdb) l 1 -> s1 = 'aaa' 2 s2 = 'bbb' 3 s3 = 'ccc' 4 s = s1 + s2 + s3 5 print(s) [EOF] 2,可以看到當前代碼中我們還沒有打任何斷點,代碼默認停在了第1行。 執行一個命令 n : (Pdb) n > d:\projects\pythonprojects\3.25pdb\test2.py(2)<module>() -> s2 = 'bbb' (Pdb) l 1 s1 = 'aaa' 2 -> s2 = 'bbb' 3 s3 = 'ccc' 4 s = s1 + s2 + s3 5 print(s) [EOF] 可以看到單步執行到了下一行。 3,如果我們想在第4行打一個斷點,用 b <行號> 命令在某一行打一個斷點: (Pdb) b 4 Breakpoint 1 at d:\projects\pythonprojects\3.25pdb\test2.py:4 (Pdb) n > d:\projects\pythonprojects\3.25pdb\test2.py(3)<module>() -> s3 = 'ccc' (Pdb) l 1 s1 = 'aaa' 2 s2 = 'bbb' 3 -> s3 = 'ccc' 4 B s = s1 + s2 + s3 5 print(s) [EOF] 這樣就成功地在第4行打了一個斷點。 4,查看當前打了哪些斷點: b 命令 (Pdb) b Num Type Disp Enb Where 1 breakpoint keep yes at d:\projects\pythonprojects\3.25pdb\test2.py:4
四、補充
在命令行中進入調試模式的方法: python -m pdb demo.py
在調試模式中按一下 Enter 鍵表示執行一下上一條命令。