最完整的Python pdb除錯用法

2021-10-14 23:33:24 字數 4614 閱讀 5021

源**:lib/pdb.py

先來重點乾貨,常用命令 ** https:

6844903847626801159

先簡單介紹一下使用命令,這裡不用記住,等用到的時候回來查就行。

1 進入命令列debug模式,python -m pdb ***.py

2 h:(help)幫助

3 w:(where)列印當前執行堆疊

4 d:(down)執行跳轉到在當前堆疊的深一層(個人沒覺得有什麼用處)

6 b:(break)新增斷點

b 列出當前所有斷點,和斷點執行到統計次數

b line_no:當前指令碼的line_no行新增斷點

b filename:line_no:指令碼filename的line_no行新增斷點

b function:在函式function的第一條可執行語句處新增斷點

複製**

7 tbreak:(temporary break)臨時斷點

在第一次執行到這個斷點之後,就自動刪除這個斷點,用法和b一樣

複製**

8 cl:(clear)清除斷點

cl 清除所有斷點

cl bpnumber1 bpnumber2.

.. 清除斷點號為bpnumber1,bpnumber2.

..的斷點

cl lineno 清除當前指令碼lineno行的斷點

cl filename:line_no 清除指令碼filename的line_no行的斷點

複製**

9 disable:停用斷點,引數為bpnumber,和cl的區別是,斷點依然存在,只是不啟用

10 enable:啟用斷點,引數為bpnumber

如果本句是函式呼叫,則s會執行到函式的第一句

複製**

如果本句是函式呼叫,則執行函式,接著執行當前執行語句的下一條。

複製**

13 r:(return)執行當前執行函式到結束

15 l:(list)列出原始碼

l 列出當前執行語句周圍11條**

l first 列出first行周圍11條**

l first second 列出first-

-second範圍的**,如果second複製**

16 a:(args)列出當前執行函式的函式

17 p expression:(print)輸出expression的值

18 pp expression:好看一點的p expression

19 run:重新啟動debug,相當於restart

20 q:(quit)退出debug

21 j lineno:(jump)設定下條執行的語句函式

只能在堆疊的最底層跳轉,向後重新執行,向前可直接執行到行號

複製**

23)condition bpnumber conditon,給斷點設定條件,當引數condition返回true的時候bpnumber斷點有效,否則bpnumber斷點無效

pdb模組定義了乙個互動式源**偵錯程式,用於 python 程式。它支援在原始碼行間設定(有條件的)斷點和單步執行,檢視堆疊幀,列出原始碼列表,以及在任何堆疊幀的上下文中執行任意 python **。它還支援事後除錯,可以在程式控制下呼叫。

偵錯程式是可擴充套件的——偵錯程式實際被定義為pdb類。該類目前沒有文件,但通過閱讀原始碼很容易理解它。擴充套件介面使用了bdbcmd模組。

偵錯程式的提示符是(pdb)。在偵錯程式的控制下執行程式的典型用法是:

>>> import pdb

>>> import mymodule

>>> pdb.run('mymodule.test()')

> (0)?()

(pdb) continue

> (1)?()

(pdb) continue

nameerror: 'spam'

> (1)?()

(pdb)

在 3.3 版更改: 由readline模組實現的 tab 補全可用於補全本模組的命令和命令的引數,例如,tab 補全會提供當前的全域性變數和區域性變數,用作p命令的引數。

也可以將pdb.py作為指令碼呼叫,來除錯其他指令碼。例如:

python3 -m pdb myscript.py
當作為指令碼呼叫時,如果要除錯的程式異常退出,pdb 除錯將自動進入事後除錯。事後除錯之後(或程式正常退出之後),pdb 將重新啟動程式。自動重啟會保留 pdb 的狀態(如斷點),在大多數情況下,這比在退出程式的同時退出偵錯程式更加實用。

3.2 新版功能:pdb.py現在接受-c選項,可以執行命令,這與將該命令寫入.pdbrc檔案相同,請參閱 偵錯程式命令。

3.7 新版功能:pdb.py現在接受-m選項,該選項用於執行乙個模組,類似於python3 -m。與指令碼相同,偵錯程式將暫停在待執行模組第一行前。

從正在執行的程式進入偵錯程式的典型用法是插入

import pdb; pdb.set_trace()
到你想進入偵錯程式的位置。然後就可以單步執行上述語句之後的**,要關閉偵錯程式繼續執行,請使用continue命令。

3.7 新版功能: 內建函式breakpoint(),當以預設引數呼叫它時,可以用來代替import pdb; pdb.set_trace()

檢查已崩潰程式的典型用法是:

>>> import pdb

>>> import mymodule

>>> mymodule.test()

traceback (most recent call last):

file "", line 1, in file "./mymodule.py", line 4, in test

test2()

file "./mymodule.py", line 3, in test2

print(spam)

nameerror: spam

>>> pdb.pm()

> ./mymodule.py(3)test2()

-> print(spam)

(pdb)

本模組定義了下列函式,每個函式進入偵錯程式的方式略有不同:

run*函式和set_trace()都是別名,用於例項化pdb類和呼叫同名方法。如果要使用其他功能,則必須自己執行以下操作:

(pdb)a #檢視全部棧內變數

(pdb)w 列出目前call stack 中的所在層。

(pdb)d 在call stack中往下移一層

(pdb)u 在call stack中往上移一層。如果在上移一層之後按下 n ,則會在上移之後的一層執行下乙個敘述,之前的 function call 就自動返回。

下方列出的是偵錯程式可接受的命令。如下所示,大多數命令可以縮寫為乙個或兩個字母。如h(elp)表示可以輸入hhelp來輸入幫助命令(但不能輸入hehel,也不能是hhelphelp)。命令的引數必須用空格(空格符或製表符)分隔。在命令語法中,可選引數括在方括號 () 中,使用時請勿輸入方括號。命令語法中的選擇項由豎線 (|) 分隔。

輸入乙個空白行將重複最後輸入的命令。例外:如果最後乙個命令是list命令,則會列出接下來的 11 行。

偵錯程式無法識別的命令將被認為是 python 語句,並在正在除錯的程式的上下文中執行。python 語句也可以用感嘆號 (!) 作為字首。這是檢查正在除錯的程式的強大方法,甚至可以修改變數或呼叫函式。當此類語句發生異常,將列印異常名稱,但偵錯程式的狀態不會改變。

偵錯程式支援 別名。別名可以有引數,使得偵錯程式對被檢查的上下文有一定程度的適應性。

在一行中可以輸入多個命令,以;;分隔。(不能使用單個;,因為它用於分隔傳遞給 python 直譯器的一行中的多條語句。)切分命令很無腦,總是在第乙個;;對處將輸入切分開,即使它位於帶引號的字串之中。

如果檔案.pdbrc存在於使用者主目錄或當前目錄中,則將其讀入並執行,等同於在偵錯程式提示符下鍵入該檔案。這對於別名很有用。若兩個檔案都存在則首先讀取主目錄中的檔案,且本地檔案可以覆蓋其中定義的別名。

在 3.2 版更改:.pdbrc現在可以包含繼續除錯的命令,如continuenext。檔案中的這些命令以前是無效的。

更詳細的介紹可參考 10分鐘教程掌握python偵錯程式pdb

python pdb斷點除錯

pdb 是 python 的乙個內建模組,用於命令列來除錯 python 使用介紹 說到 debug,肯定是要新增斷點的,這裡有兩種方式新增斷點 1.在想要斷點 後新增 一行 pdb.set trace 若是使用這種方式,直接執行 python 檔案即可進入斷點除錯。2.用命令列來新增斷點 b li...

python pdb 斷點除錯

import pdb pdb.set trace a args 列出當前執行函式的函式 p expression print 輸出expression的值 eg p list map lambda x x.lower manager ssids u 40 mgmt u 123 u 112 u 112...

初學python pdb除錯命令

pdb除錯命令 完整命令 簡寫命令 描述args a列印當前函式的引數 break b設定斷點 clear cl清除斷點 condition 無設定條件斷點 continue c或者cont 繼續執行,知道遇到斷點或者指令碼結束 disable 無禁用斷點 enable 無啟用斷點 help h檢視...