原文:https://xmfbit.github.io/2017/08/21/debugging-with-ipdb/python
IPDB是什麼?IPDB(Ipython Debugger),和GDB相似,是一款集成了Ipython的Python代碼命令行調試工具,能夠看作PDB的升級版。這篇文章總結IPDB的使用方法,主要是若干命令的使用。更多詳細的教程或文檔還請參考Google。git
IPDB以Python第三方庫的形式給出,使用pip install ipdb
便可輕鬆安裝。github
在使用時,有兩種常見方式。函數
經過在代碼開頭導入包,能夠直接在代碼指定位置插入斷點。以下所示:工具
1
2
3
4
5
6
|
import ipdb
# some code
x =
10
ipdb.set_trace()
y =
20
# other code
|
則程序會在執行完x = 10
這條語句以後中止,展開Ipython環境,就能夠自由地調試了。spa
上面的方法很方便,可是也有不靈活的缺點。對於一段比較棘手的代碼,咱們可能須要按步執行,邊運行邊跟蹤代碼流並進行調試,這時候使用交互式的命令式調試方法更加有效。啓動IPDB調試環境的方法也很簡單:命令行
1
|
python -m ipdb your_code.py
|
IPDB調試環境提供的常見命令有:debug
幫助文檔就是這樣一個東西:當你寫的時候以爲這TM也要寫?當你看別人的東西的時候以爲這TM都沒寫?調試
使用h
便可調出IPDB的幫助。可使用help command
的方法查詢特定命令的具體用法。rest
使用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的所有。其餘的命令還請參照幫助文檔。文檔在手,天下我有!