零基礎學習PDB命令列除錯Python程式碼

PyPer發表於2015-03-18

你有多少次陷入不得不更改別人程式碼的境地?如果你是一個開發團隊的一員,那麼你遇到上述境地的次數比你想要的還要多。然而,Python中有一個整潔的除錯特性(像其他大多數語言一樣),在這種情況下使用非常方便。本文是一篇快速教程,希望它能讓你的編碼生活更加容易。

1. 一個混亂的程式

出於本教程的目的,讓我們研究一下下面的簡單程式。

這個程式接收兩個命令列引數,然後執行加法和減法操作。

(假設使用者輸入的是有效值,因此程式碼中我們沒有進行錯誤處理。)

2. PDB

Python提供了一個有用的模組PDB,它實際上是一個互動式原始碼偵錯程式。

你需要下面的兩行程式碼來使用此模組。

看一下我們修改過的程式,裡面包含了一些斷點。

3. 程式執行觸發偵錯程式

一旦你設定好斷點以後,你就可以像平時一樣執行程式。

程式將會在遇到的第一個斷點處停止執行。

我們在第14行設定了一個斷點,所以我們能看到將要執行的下一行是第15行。可以看到,在執行到第15行之前程式已經停止。

在這裡我們有幾個選項,讓我們在下面步驟中看看一些除錯指令。

4. 下一行->n

在你的偵錯程式提示中,輸入n執行到下一行。

這會執行當前行程式碼,並準備執行下一行。

我們可以使用n來逐行執行整個程式,但這其實沒有什麼用處。

可能你已經看到,PDB實際上並沒有進入我們的add函式中。下面,就讓我們看看其他幾個令除錯更加有趣的選項。

注意:
一個更酷的特性是你可以單擊Enter鍵來執行以前的命令(在本例中只要指令n)。

5. 列印->p

下面,我們再次開始除錯程式。(你可以通過單擊c使PDB跳到末尾或者直到下一個斷點,因為程式中我們並沒有其他的斷點了,所有程式將會執行完成。)

現在,如果我們想知道sys.argv中包含什麼內容,我們可以輸入以下內容:

使用這種方法可以相當方便地檢視變數中實際儲存著什麼值。

現在我們將進入加法函式內部。

6. 單步->s

我們可以使用“s”進入加法函式內部。

這將把我們帶入加法函式的內部,現在我們可以在加法函式內部使用n、p和其他的操作指令。

此時單擊“r”將會把我們帶到前面進入函式的返回語句。

如果你想快速跳轉到一個函式的結尾處,那麼這個指令將很有用。

7. 動態新增斷點- > b

前面,在程式執行之前,我們使用pdb.set_trace()設定了一個斷點。

不過,經常在除錯會話已經開始之後,我們想要在程式中特定的地方新增斷點。

這裡我們就可以使用選項“b”來實現這種目的。

我們重新開始執行程式。

此時我在第18行設定一個斷點。

從上面我們可以看到,PDB跳到了第18行並等待下一個指令。

同時,PDB還為該斷點分配了一個號碼(在本例中是1)。為了以後的執行,我們可以通過開啟或禁用斷點號碼來啟用或停用對應的斷點。

8. 列表->l

有時在除錯的時候,你可能會忘記此時你處在程式碼的什麼地方。在這種情況下,使用“l”將會列印出一個友好的總結,它能夠顯示出此刻你在程式碼中的位置。

9. 動態分配變數

在除錯會話期間,你可以分配變數來幫助你進行除錯,知道這些對你來說也是有幫助的。例如:

注意:
如果你想設定一些如n(即PDB指令)這樣的變數,你應該使用這種指令:

10. 結束->q

最後,在程式碼的任何地方如果你想結束除錯,可以使用“q”,那麼正在執行的程式將會終止。

11. 擴充套件閱讀

本文只涉及到了PDB的表面用法,其實使用PDB你還可以做到更多(PDB 文件)。

使用IPython的人可以在ipdb中找到一個更好的偵錯程式,它提供了tab補充、語法高亮和其他一些很酷的特性。

相關文章