調試線上的Python程序時,雖然PyCharm能夠實現遠程調試,但pdb纔是最便捷的方式,本文簡單介紹pdb工具的使用,但願各位除了掌握PyCharm調試技巧外,還能夠掌握pdb的最基本用法。python
學習一個調試工具,能夠從最關鍵的4個功能開始學習:bash
pdb是python內置的調試工具,不須要額外安裝,咱們直接開搞。函數
準備一段簡單的代碼,好比計算斐波那契數列的代碼(習慣性的以斐波那契舉例...)。工具
def Fibonacci(n):
a, b = 0, 1
while n > 0:
a, b = b, a + b
print(b)
n -= 1
Fibonacci(10)
複製代碼
設置斷點分兩種,一種是侵入式的添加斷點,須要在但願被斷點處添加**「import pdb;pdb.set_trace()」,另外一種則是非入侵式的添加斷點,經過-m指定參數指定經過pdb來運行項目,完整命令爲「python3 -m pdb 斐波那契數列.py」**,該命令會將斷點打在程序的入口。學習
隨後能夠經過**「l」**命令來查看斷點周圍的11行項目代碼,斷點所在位置會經過「->」符號標記出來,以下。spa
(Pdb) l
1 def Fibonacci(n):
2 a, b = 0, 1
3 while n > 0:
4 import pdb;pdb.set_trace()
5 -> a, b = b, a + b
6 print(b)
7 n -= 1
8
9 Fibonacci(10)
[EOF]
複製代碼
若是屢次使用「l」命令,則能夠實現翻頁查看當前斷點下的代碼,若是須要查看當前函數或模塊的全部代碼,則可使用**「ll」**命令。debug
調試線上代碼一般會經過非入侵式的方式進行調試,而後經過**「b」**命令添加斷點,該命令幾種使用方式:調試
簡單使用一下。code
(Pdb) b 7 # 在第7行添加斷點
Breakpoint 1 at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:7
(Pdb) b 斐波那契數列.py:8 # 在 斐波那契數列.py 文件的第8行添加斷點
Breakpoint 2 at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:8
(Pdb) b Fibonacci # 在名爲 Fibonacci 函數的第1行添加斷點
Breakpoint 3 at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:1
(Pdb) b # 查看斷點狀態
Num Type Disp Enb Where
1 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:7
2 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:8
3 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:1
(Pdb)
複製代碼
此外能夠經過**「tbreak」**命令添加臨時斷點,所謂臨時斷點就是使用一次後,斷點將會被清楚,這能夠運用在循環體中,一個循環,若是經過命令「b」打斷點,那麼每次循環處理都會卡在命令「b」設下的斷點處,若是使用「tbreak」命令,斷點只會在循環體中生效一次。內存
「tbreak」命令的使用方式以下,與命令「b」的參數一致
tbreak
tbreak lineno
tbreak filename:lineno
tbreak functionname
複製代碼
若是但願清楚某個斷點,可使用**「cl」命令**,該命令的幾種使用方式以下:
簡單使用一下。
(Pdb) b # 查看當前斷點狀態
Num Type Disp Enb Where
1 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:1
2 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:2
3 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:7
(Pdb) cl 斐波那契數列.py:7 # 刪除 斐波那契數列.py 文件中第7行對應的斷點
(Pdb) b # 查看當前斷點狀態
Num Type Disp Enb Where
1 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:1
2 breakpoint keep yes at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:2
(Pdb) cl # 清理全部的斷點
Clear all breaks? y
Deleted breakpoint 1 at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:1
Deleted breakpoint 2 at /Users/ayuliao/Desktop/workspace/test/斐波那契數列.py:2
(Pdb) b
(Pdb)
複製代碼
pdb中提供了多種命令實現代碼的執行,整體能夠分爲逐行執行命令與非逐行執行命令。
**「s」、「n」、「r」**這3個命令很是類似,均可以逐行執行代碼,其主要的區別在於如何對待函數。
若是但願非逐行執行代碼,則可使用**「c」命令或「unt」命令**。
此外,經過**「j」**命令要能夠跳轉到某一行,但該命令會直接跳過中間的代碼,不去執行。
在某個位置打斷點的目的是爲了知道程序執行到當前位置其各類變量狀態是否正常,這就須要經過某種方法查看內存中的數據了。
最經常使用的即是經過**「p」命令查看當前內存中某個變量的值,相似於在代碼中使用print()方法打印某個變量同樣,若是打印的是一個具備複雜結構的變量,能夠經過「pp」命令將打印輸出的結果美化,若是須要知道變量的類型,能夠經過「whatis」**命令來查看。
此外,若是斷點在函數體中,能夠經過**「a」**命令查看當前函數體的參數和這些參數對應的值。
簡單使用一下上述幾個命令。
(Pdb) p a # 查看變量a的值
0
(Pdb) whatis a # 查看變量a的類型
<class 'int'>
(Pdb) a # 查看Fibonacci方法的參數名與參數對應的值
n = 10
(Pdb) pp b # 查看變量b的值
1
(Pdb)
複製代碼
pdb提供了多種方法來操做當前斷點處內存中的數據,最經常使用的即是使用**「interact」**命令進入交互式解釋器中對當前內存中的數據進行各類操做。
在interact狀態下修改內存中的數據並不會對程序產生實質的影響,全部修改在退出interact狀態後將被清除。
在Windows系統中,經過「ctrl+d」即可以退出interact狀態,返回pdb,而在MacOS系統中,須要經過「control+d」命令來退出interact狀態。
簡單使用一下。
(Pdb) interact # 進入交互式解釋器中操做當前內存中的數據
*interactive*
>>> a
0
>>> a = a + 1 # 修改當前內存中變量a的值
>>> print(a)
1
>>> b
1
>>> ^D # control+d退出interact狀態
now exiting InteractiveConsole...
(Pdb) p a # 查看變量a,其值未被改變
0
複製代碼
pdb是一款簡單的工具,掌握它可讓你在沒有IDE的工做環境輕鬆debug Python代碼。
若是文章對應有所幫助,請點擊「在看」或「讚揚」,這是對我最大的鼓勵。