入門Python調試器pdb

前言

調試線上的Python程序時,雖然PyCharm能夠實現遠程調試,但pdb纔是最便捷的方式,本文簡單介紹pdb工具的使用,但願各位除了掌握PyCharm調試技巧外,還能夠掌握pdb的最基本用法。python

學習一個調試工具,能夠從最關鍵的4個功能開始學習:bash

  • 1.如何設置斷點(新增、刪除)
  • 2.如何執行斷點代碼
  • 3.如何查看內存中的數據
  • 4.如何操做內存中的數據

pdb是python內置的調試工具,不須要額外安裝,咱們直接開搞。函數

1.如何設置斷點

準備一段簡單的代碼,好比計算斐波那契數列的代碼(習慣性的以斐波那契舉例...)。工具

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」**命令添加斷點,該命令幾種使用方式:調試

  • 1.單獨使用「b」命令只是查看斷點設置
  • 2.使用「b lineno」命令會在當前模塊的對應行數(lineno)添加斷點
  • 3.使用「b filename:lineno 」命名會在某個文件(filename)的對應行(lineno)添加斷點
  • 4.使用「b function」命令會在某個方法(function)的第一行設置斷點

簡單使用一下。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」命令**,該命令的幾種使用方式以下:

  • 1.單獨使用「cl」命令會清除全部的斷點,包括臨時斷點,在執行清理前會提示確認
  • 2.使用「cl filename:lineno」命令能夠清除某個文件中具體某一行的斷點

簡單使用一下。

(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)
複製代碼

2.如何執行斷點代碼

pdb中提供了多種命令實現代碼的執行,整體能夠分爲逐行執行命令與非逐行執行命令。

**「s」、「n」、「r」**這3個命令很是類似,均可以逐行執行代碼,其主要的區別在於如何對待函數。

  • 1.「s」命令會執行下一行代碼,若是下一行是某函數的調用,則會進入函數體中
  • 2.「n」命令會執行下一行,遇到函數調用並不會進入函數體
  • 3.「r」命令一樣會執行下一行代碼,遇到函數調用會直接執行到函數體的最後一行

若是但願非逐行執行代碼,則可使用**「c」命令或「unt」命令**。

  • 1.「c」命令會執行到下一個斷點所在位置,若是是最後一個斷點了,那麼就會執行完整個程序
  • 2.「unt lineno」命令會執行到指定的某一行或者下一個斷點所在位置。

此外,經過**「j」**命令要能夠跳轉到某一行,但該命令會直接跳過中間的代碼,不去執行。

3.如何查看內存中的數據

在某個位置打斷點的目的是爲了知道程序執行到當前位置其各類變量狀態是否正常,這就須要經過某種方法查看內存中的數據了。

最經常使用的即是經過**「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)
複製代碼

4.如何操做內存中的數據

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代碼。

若是文章對應有所幫助,請點擊「在看」或「讚揚」,這是對我最大的鼓勵。

相關文章
相關標籤/搜索