python調試之pdb


一、PDB調試命令

 

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 鍵表示執行一下上一條命令。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM