用了三年的 pdb,沒想到還能這麼調試
關於代碼調試的技巧,我之前寫過很多的文章,加起來也有 將近 10 篇了,關注比較早的同學,也應該都有看過。
其中有一篇是關於 pdb 的調試技巧的:使用 pdb 進行無界面調試
裏面介紹了兩種 pdb 的調試入口,也是大部分所熟知的。
這裏再帶大家回顧一下
第一種:指定 -m pdb
來開啓
$ python -m pdb pdb_demo.py
第二種:使用 pdb.set_trace()
在代碼中設置斷點
import pdb
pdb.set_trace()
但其實,pdb 還另外兩種調試方法,第一種方法,可能有 99% 的開發者都沒用過,甚至連見過都沒有。
這兩種方法,是配合 Python Console 的交互界面來實現的。
首先我準備好一個名爲 utils.py
的 Python 文件,裏面定義了一個 sum 的工具函數(僅作演示用)。
def sum(*args):
result = 0
for arg in args:
result += arg
return result
然後在終端敲入 Python 進入 Console 的模式,導入這個模塊,並調用 sum 函數,在正常情況下,函數可以正常工作。
>>> import utils
>>> utils.sum(1,2,3)
6
但如果你的參數類型傳成了 str,函數就會報錯啦~
>>> utils.sum(1,2,"3")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/MING/utils.py", line 4, in sum
result += arg
TypeError: unsupported operand type(s) for +=: int and str
由於這裏的報錯是我刻意觸發的,從報錯來看,是很容易定位的。
但是在實際應用中,難免會遇到一些無法從報錯信息直接判斷 bug 所在的情況。
這個時候,如果可以在報錯後,切換到 pdb 的調試模式就好了~
事實上,pdb 是支持這種用法的。
只要你在當前的會話中,導入 pdb,再執行 pdb.pm()
,就可以切換到熟悉的 pdb 調試界面,並在拋錯的地方打上斷點,然後你就可以任意的查看運行時的變量信息。
如果你不是想等報錯了再調試,而是一開始就想進入調試模式,可以使用 pdb.runcall()
函數
有的同學可能還會想到 pdb.run()
和 pdb.runeval()
這兩個函數,但這兩種方法,是需要提前在函數調試斷點的,這就比較麻煩了,一般情況下不推薦使用。
綜上所述, pdb 調試方法主要有六種:
-
python -m pdb
:運行 python 文件時直接進入調試模式 -
pdb.set_trace()
:事先設置斷點,然後直接運行 python 文件 -
pdb.run()
:事先設置斷點,然後直接運行 python 模塊 -
pdb.runeval()
:事先設置斷點,然後直接運行 python 模塊(與 pdb.run 類似) -
pdb.pm()
:在 Console 模式下出錯後直接切換到調試模式,並定位到報錯位置。 -
pdb.runcall()
:可以在不設置斷點的情況下,直接調試代碼片段。
其中,pdb.pm()
是本文的重點,他雖然冷門,但卻很好用,推薦給大家。
以上就是我今天的分享,希望對你有用,如果你也有好用的調試小技巧,歡迎留言分享,互相學習。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Q5P037abid03H4-ypWa7qg