欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中斷點(diǎn)調(diào)試pdb包的用法詳解

 更新時(shí)間:2024年01月03日 16:18:50   作者:kevin小新  
pdb(python debugger) 是 python 中的一個(gè)命令行調(diào)試包,為 python 程序提供了一種交互的源代碼調(diào)試功能,下面就跟隨小編一起學(xué)習(xí)一下它的具體使用吧

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)文章

最新評論