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

