Python中斷點(diǎn)調(diào)試pdb包的用法詳解
pdb(python debugger) 是 python 中的一個(gè)命令行調(diào)試包,為 python 程序提供了一種交互的源代碼調(diào)試功能,其官方使用文檔鏈接為 pdb — Python 的調(diào)試器。
pdb 的主要功能包括設(shè)置斷點(diǎn)、單步調(diào)試、進(jìn)入函數(shù)調(diào)試、查看當(dāng)前代碼、查看變量、棧片段的值等,從而可以減少或者避免使用 print 和 log 等雜亂繁瑣的方式進(jìn)行 python 代碼的調(diào)試。
安裝及使用方法
pdb 包的安裝方法很簡單,直接在環(huán)境中通過下面的 pip 即可安裝:
pip install pdb
pdb 包的使用方法也很簡單,直接在代碼中想要進(jìn)入調(diào)試器的地方插入下面兩行命令,然后保存并再次執(zhí)行當(dāng)前 python 文件就可以自動(dòng)跳轉(zhuǎn)到該斷點(diǎn)位置,然后便可以自行打印出相關(guān)內(nèi)容進(jìn)行調(diào)試。
import pdb pdb.set_trace() # 也可以將上面兩行寫在一行,通過;號分隔 import pdb; pdb.set_trace()
pdb 常用命令
當(dāng)在代碼中添加了上述的兩行命令運(yùn)行程序后,程序會(huì)自動(dòng)跳轉(zhuǎn)至代碼所在斷點(diǎn)位置,下面便可以在終端中查看相應(yīng)的變量進(jìn)行調(diào)試。進(jìn)入 pdb 調(diào)試斷點(diǎn)模式后,可以使用命令來控制調(diào)試和檢查程序的狀態(tài),pdb 中一些常用命令如下:
命令 | 解釋 |
---|---|
next 或 n | 繼續(xù)運(yùn)行,直到運(yùn)行到當(dāng)前函數(shù)的下一行 |
step 或 s | 運(yùn)行當(dāng)前行,在第一個(gè)可以停止的位置(在被調(diào)用的函數(shù)內(nèi)部或在當(dāng)前函數(shù)的下一行)停下 |
continue 或 c | 繼續(xù)執(zhí)行程序,直到遇到下一個(gè)斷點(diǎn) |
list 或 l | 列出當(dāng)前文件的源代碼 |
p XXX | 打印變量或者表達(dá)式的值(XXX為變量或表達(dá)式的名稱) |
print(XXX) 也可以使用,但它不是一個(gè)調(diào)試器命令 | 它執(zhí)行 Python 中的 print() 函數(shù)打印變量XXX的值 |
return 或 r | 繼續(xù)執(zhí)行代碼,直到當(dāng)前函數(shù)返回 |
quit 或 q | 退出調(diào)試器,被執(zhí)行的程序?qū)⒈恢兄?/td> |
break 或 b | 設(shè)置斷點(diǎn) |
help | 幫助 |
調(diào)試代碼示例
下面是一個(gè)簡單的對 list 的列表 items_list 中所有元素求和并返回的代碼示例,為了通過示例進(jìn)行演示,博主將 list 中元素求和寫在 sum_list(items) 函數(shù)中,并將兩元素相加(+)又寫成了一個(gè)函數(shù) sum_ab(a, b) ,下面的代碼是原始的代碼:
# 對items的所有元素求和并返回 def sum_list(items): items_sum = 0 for i in range(len(items_list)): item = items_list[i] items_sum = sum_ab(items_sum, item) return items_sum # 對a和b兩個(gè)元素進(jìn)行求和 def sum_ab(a, b): sum = a + b return sum if __name__ == "__main__": items_list = [1, 2, 3, 4, 5] items_sum = sum_list(items_list) print("items_sum求和所得的結(jié)果為:", items_sum)
在上述代碼中 sum_list(items)
函數(shù)中添加調(diào)試 import pdb; pdb.set_trace()
命令用于設(shè)置斷點(diǎn)。
# 對items的所有元素求和并返回 def sum_list(items): items_sum = 0 for i in range(len(items_list)): import pdb; pdb.set_trace() item = items_list[i] items_sum = sum_ab(items_sum, item) return items_sum # 對a和b兩個(gè)元素進(jìn)行求和 def sum_ab(a, b): sum = a + b return sum if __name__ == "__main__": items_list = [1, 2, 3, 4, 5] items_sum = sum_list(items_list) print("items_sum求和所得的結(jié)果為:", items_sum)
開始調(diào)試:運(yùn)行上面的添加 pdb 命令的程序后,程序會(huì)停留在 pdb.set_trace() 處,并且命令行的左端由 (base) 會(huì)變成 (pdb) 提示當(dāng)前進(jìn)入了 pdb 調(diào)試模式。
由于 items_list 共包含 5 個(gè)元素,所以 sum_list(items) 函數(shù)中 for 循環(huán)共執(zhí)行 5 次就會(huì)得到結(jié)果并返回到主函數(shù)。
下面的過程就是將一些常用的 pdb 命令執(zhí)行的結(jié)果,博主將每行代碼的作用通過 # 功能 的形式寫在每行代碼的右側(cè),方便大家理解。
(base) PS F:\Code\ceshi> python ./ceshi.py # 運(yùn)行當(dāng)前添加了import pdb; pdb.set_trace()的程序 > f:\code\ceshi\ceshi.py(6)sum_list() -> item = items_list[i] # 執(zhí)行程序知道遇到斷點(diǎn)時(shí)停止(此時(shí)是第1次for循環(huán)中) (Pdb) l # l命令 列出當(dāng)前文件的源代碼 1 # 對items的所有元素求和并返回 # ->表示下一行將要執(zhí)行的命令即item=items_list[i],上一行已執(zhí)行完 2 def sum_list(items): 3 items_sum = 0 4 for i in range(len(items_list)): 5 import pdb; pdb.set_trace() 6 -> item = items_list[i] 7 items_sum = sum_ab(items_sum, item) 8 return items_sum 9 10 # 對a和b兩個(gè)元素進(jìn)行求和 11 def sum_ab(a, b): (Pdb) n # n命令 繼續(xù)運(yùn)行,直到運(yùn)行到當(dāng)前函數(shù)的下一行(當(dāng)前行item=items_list[i]已執(zhí)行完,并且->移動(dòng)到下一行) > f:\code\ceshi\ceshi.py(7)sum_list() -> items_sum = sum_ab(items_sum, item) (Pdb) p item # p命令 打印變量item的值(第一次for循環(huán),item為=items_list[0]=1) 1 (Pdb) s # s命令 運(yùn)行當(dāng)前行,在被調(diào)用的sum_ab(a,b)函數(shù)內(nèi)部停下 --Call-- > f:\code\ceshi\ceshi.py(11)sum_ab() -> def sum_ab(a, b): (Pdb) r # r命令 繼續(xù)執(zhí)行代碼,直到當(dāng)前函數(shù)sum_ab(a,b)返回 --Return-- > f:\code\ceshi\ceshi.py(13)sum_ab()->1 -> return sum (Pdb) p sum # p命令 打印變量sum的值(sum是sum_ab(a,b)返回的值,items_list[0]第一個(gè)元素求和的結(jié)果) 1 (Pdb) c # c命令 繼續(xù)運(yùn)行,僅在遇到斷點(diǎn)時(shí)停止(跳轉(zhuǎn)到第2次for循環(huán)中) > f:\code\ceshi\ceshi.py(5)sum_list() -> import pdb; pdb.set_trace() (Pdb) c # c命令 繼續(xù)運(yùn)行,僅在遇到斷點(diǎn)時(shí)停止(跳轉(zhuǎn)到第3次for循環(huán)中) > f:\code\ceshi\ceshi.py(6)sum_list() -> item = items_list[i] (Pdb) c # c命令 繼續(xù)運(yùn)行,僅在遇到斷點(diǎn)時(shí)停止(跳轉(zhuǎn)到第4次for循環(huán)中) > f:\code\ceshi\ceshi.py(5)sum_list() -> import pdb; pdb.set_trace() (Pdb) c # c命令 繼續(xù)運(yùn)行,僅在遇到斷點(diǎn)時(shí)停止(跳轉(zhuǎn)到第5次for循環(huán)中) > f:\code\ceshi\ceshi.py(6)sum_list() -> item = items_list[i] (Pdb) l # l命令 列出當(dāng)前文件的源代碼 1 # 對items的所有元素求和并返回 2 def sum_list(items): 3 items_sum = 0 4 for i in range(len(items_list)): 5 import pdb; pdb.set_trace() 6 -> item = items_list[i] 7 items_sum = sum_ab(items_sum, item) 8 return items_sum 9 10 # 對a和b兩個(gè)元素進(jìn)行求和 11 def sum_ab(a, b): (Pdb) n # n命令 繼續(xù)運(yùn)行,直到運(yùn)行到當(dāng)前函數(shù)的下一行(->移動(dòng)到下一行) > f:\code\ceshi\ceshi.py(7)sum_list() -> items_sum = sum_ab(items_sum, item) (Pdb) p item # p命令 打印變量item的值(第5次for循環(huán)) 5 (Pdb) n # n命令 繼續(xù)運(yùn)行,直到運(yùn)行到當(dāng)前函數(shù)的下一行(->移動(dòng)到下一行) > f:\code\ceshi\ceshi.py(4)sum_list() -> for i in range(len(items_list)): (Pdb) p items_sum # p命令 打印變量items_sum的值(第5次for循環(huán)后:所有元素相加得到的總值) 15 (Pdb) q # q Traceback (most recent call last): File "F:\Code\ceshi\ceshi.py", line 17, in <module> items_sum = sum_list(items_list) File "F:\Code\ceshi\ceshi.py", line 4, in sum_list for i in range(len(items_list)): File "F:\Code\ceshi\ceshi.py", line 4, in sum_list for i in range(len(items_list)): File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 88, in trace_dispatch return self.dispatch_line(frame) File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 113, in dispatch_line if self.quitting: raise BdbQuit bdb.BdbQuit (base) PS F:\Code\ceshi>
以上就是Python中斷點(diǎn)調(diào)試pdb包的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python斷點(diǎn)調(diào)試pdb的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對pandas中兩種數(shù)據(jù)類型Series和DataFrame的區(qū)別詳解
今天小編就為大家分享一篇對pandas中兩種數(shù)據(jù)類型Series和DataFrame的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Keras設(shè)置以及獲取權(quán)重的實(shí)現(xiàn)
這篇文章主要介紹了Keras設(shè)置以及獲取權(quán)重的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python3定位并識別圖片驗(yàn)證碼實(shí)現(xiàn)自動(dòng)登錄功能
這篇文章主要介紹了python3定位并識別圖片驗(yàn)證碼實(shí)現(xiàn)自動(dòng)登錄功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01matplotlib基礎(chǔ)繪圖命令之errorbar的使用
這篇文章主要介紹了matplotlib基礎(chǔ)繪圖命令之errorbar的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python爬蟲實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片
最近決定寫個(gè)P站的爬蟲,實(shí)際操作起來確實(shí)遇到了些新問題,通過解決也有所收獲,下面這篇文章主要給大家介紹了關(guān)于python爬蟲實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片的相關(guān)資料,需要的朋友可以參考下2022-07-07Python實(shí)現(xiàn)統(tǒng)計(jì)英文單詞個(gè)數(shù)及字符串分割代碼
這篇文章主要介紹了Python實(shí)現(xiàn)統(tǒng)計(jì)英文單詞個(gè)數(shù)及字符串分割方法,本文分別給出代碼實(shí)例,需要的朋友可以參考下2015-05-05