如果你還主要靠print來調(diào)試代碼,那值得花10分鐘試試pdb這個Python自帶的Debug工具。

pdb有2種用法:
- 非侵入式方法(不用額外修改源代碼,在命令行下直接運(yùn)行就能調(diào)試)
python3 -m pdb filename.py
- 侵入式方法(需要在被調(diào)試的代碼中添加一行代碼然后再正常運(yùn)行代碼)
import pdb;pdb.set_trace()
當(dāng)你在命令行看到下面這個提示符時,說明已經(jīng)正確打開了pdb
(Pdb)
然后就可以開始輸入pdb命令了。
先看一個pdb的常用命令的簡明表格,然后詳細(xì)說明。
| 命令 | 功能 |
|---|---|
| l或ll | 查看源代碼 |
| b | 添加斷點(diǎn) |
| tbreak | 添加臨時斷點(diǎn) |
| cl | 清除斷點(diǎn) |
| p | 打印變量值 |
| s或n或r | 逐行調(diào)試命令 |
| c | 非逐行調(diào)試命令 |
| a | 查看函數(shù)參數(shù) |
| interact | 啟動交互式解釋器 |
| whatis | 打印變量類型 |
| w | 打印堆棧信息 |
| q | 退出pdb |
詳細(xì)說明
1、查看源代碼
命令:
l
說明:
查看當(dāng)前位置前后11行源代碼(多次會翻頁)
當(dāng)前位置在代碼中會用-->這個符號標(biāo)出來
命令:
ll
說明:
查看當(dāng)前函數(shù)或框架的所有源代碼
2、添加斷點(diǎn)
命令:
b
b lineno
b filename:lineno
b functionname
參數(shù):
filename文件名,斷點(diǎn)添加到哪個文件
lineno斷點(diǎn)添加到哪一行
function:函數(shù)名,在該函數(shù)執(zhí)行的第一行設(shè)置斷點(diǎn)
說明:
1.不帶參數(shù)表示查看斷點(diǎn)設(shè)置
2.帶參則在指定位置設(shè)置一個斷點(diǎn)
3、添加臨時斷點(diǎn)
命令:
tbreak
tbreak lineno
tbreak filename:lineno
tbreak functionname
參數(shù):
同b
說明:
執(zhí)行一次后時自動刪除(這就是它被稱為臨時斷點(diǎn)的原因)
4、清除斷點(diǎn)
命令:
cl
cl filename:lineno
cl bpnumber [bpnumber ...]
參數(shù):
bpnumber 斷點(diǎn)序號(多個以空格分隔)
說明:
1.不帶參數(shù)用于清除所有斷點(diǎn),會提示確認(rèn)(包括臨時斷點(diǎn))
2.帶參數(shù)則清除指定文件行或當(dāng)前文件指定序號的斷點(diǎn)
5、打印變量值
命令:
p expression
參數(shù):
expression Python表達(dá)式
6、逐行調(diào)試命令
包括 s ,n , r 這3個相似的命令,區(qū)別在如何對待函數(shù)上
命令1:
s
說明:
執(zhí)行下一行(能夠進(jìn)入函數(shù)體)
命令2:
n
說明:
執(zhí)行下一行(不會進(jìn)入函數(shù)體)
命令3:
r
說明:
執(zhí)行下一行(在函數(shù)中時會直接執(zhí)行到函數(shù)返回處)
7、非逐行調(diào)試命令
命令1:
c
說明:
持續(xù)執(zhí)行下去,直到遇到一個斷點(diǎn)
命令2
unt lineno
說明:
持續(xù)執(zhí)行直到運(yùn)行到指定行(或遇到斷點(diǎn))
命令3
j lineno
說明:
直接跳轉(zhuǎn)到指定行(注意,被跳過的代碼不執(zhí)行)
8、查看函數(shù)參數(shù)
命令:
a
說明:
在函數(shù)中時打印函數(shù)的參數(shù)和參數(shù)的值
9、打印變量類型
命令:
whatis expression
說明:
打印表達(dá)式的類型,常用來打印變量值
10、啟動交互式解釋器
interact
說明:
啟動一個python的交互式解釋器,使用當(dāng)前代碼的全局命名空間(使用ctrl+d返回pdb)
11、打印堆棧信息
w
說明:
打印堆棧信息,最新的幀在最底部。箭頭表示當(dāng)前幀。
12、退出pdb
q
完成了。好吧,可能超過了10分鐘,我承認(rèn)這是一個善意的謊言,不過至此你已經(jīng)掌握了,擊個掌吧。