使用IPDB調試Python代碼


(轉載自:https://xmfbit.github.io/2017/08/21/debugging-with-ipdb/)

IPDB是什么?IPDB(Ipython Debugger),和GDB類似,是一款集成了Ipython的Python代碼命令行調試工具,可以看做PDB的升級版。這篇文章總結IPDB的使用方法,主要是若干命令的使用。更多詳細的教程或文檔還請參考Google。

安裝與使用

IPDB以Python第三方庫的形式給出,使用pip install ipdb即可輕松安裝。

在使用時,有兩種常見方式。

集成到源代碼中

通過在代碼開頭導入包,可以直接在代碼指定位置插入斷點。如下所示:

1
2
3
4
5
6
import ipdb
# some code
x = 10
ipdb .set_trace()
y = 20
# other code

 

則程序會在執行完x = 10這條語句之后停止,展開Ipython環境,就可以自由地調試了。

命令式

上面的方法很方便,但是也有不靈活的缺點。對於一段比較棘手的代碼,我們可能需要按步執行,邊運行邊跟蹤代碼流並進行調試,這時候使用交互式的命令式調試方法更加有效。啟動IPDB調試環境的方法也很簡單:

1
python -m ipdb your_code.py

 

常用命令

IPDB調試環境提供的常見命令有:

幫助

幫助文檔就是這樣一個東西:當你寫的時候覺得這TM也要寫?當你看別人的東西的時候覺得這TM都沒寫?

使用h即可調出IPDB的幫助。可以使用help command的方法查詢特定命令的具體用法。

下一條語句

使用n(next)執行下一條語句。注意一個函數調用也是一個語句。如何能夠實現類似“進入函數內部”的功能呢?

進入函數內部

使用s(step into)進入函數調用的內部。

打斷點

使用b line_number(break)的方式給指定的行號位置加上斷點。使用b file_name:line_number的方法給指定的文件(還沒執行到的代碼可能在外部文件中)中指定行號位置打上斷點。

另外,打斷點還支持指定條件下進入,可以查詢幫助文檔。

一直執行直到遇到下一個斷點

使用c(continue)執行代碼直到遇到某個斷點或程序執行完畢。

一直執行直到返回

使用r(return)執行代碼直到當前所在的這個函數返回。

跳過某段代碼

使用j line_number(jump)可以跳過某段代碼,直接執行指定行號所在的代碼。

更多上下文

在IPDB調試環境中,默認只顯示當前執行的代碼行,以及其上下各一行的代碼。如果想要看到更多的上下文代碼,可以使用l first[, second](list)命令。

其中first指示向上最多顯示的行號,second指示向下最多顯示的行號(可以省略)。當second小於first時,second指的是從first開始的向下的行數(相對值vs絕對值)。

根據SO上的這個問題,你還可以修改IPDB的源碼,一勞永逸地改變上下文的行數。

我在哪里

調試興起,可能你會忘了自己目前所在的行號。例如在打印了若干變量值后,屏幕完全被這些值占據。使用w或者where可以打印出目前所在的行號位置以及上下文信息。

這是啥

我們可以使用whatis variable_name的方法,查看變量的類別(感覺有點雞肋,用type也可以辦到)。

列出當前函數的全部參數

當你身處一個函數內部的時候,可以使用a(argument)打印出傳入函數的所有參數的值。

打印

使用p(print)和pp(pretty print)可以打印表達式的值。

清除斷點

使用cl或者clear file:line_number清除斷點。如果沒有參數,則清除所有斷點。

再來一次

使用restart重新啟動調試器,斷點等信息都會保留。restart實際是run的別名,使用run args的方式傳入參數。

退出

使用q退出調試,並清除所有信息。

當然,這並不是IPDB的全部。其他的命令還請參照幫助文檔。文檔在手,天下我有!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM