如果沒有 IDE,該如何 Debug?
寫代碼時(shí)噼里啪啦,一頓操作猛如虎,一運(yùn)行,發(fā)現(xiàn)不是 error 就是 exception,這是程序員經(jīng)常遇到的場(chǎng)景,解決它就需要一步步去排錯(cuò),排錯(cuò)的這個(gè)過程叫做 Debug。
借助 IDE(比如大名鼎鼎的 PyCharm 、VSCode) 本身的調(diào)試和跳轉(zhuǎn)功能,你可以輕松定位到問題代碼,但在服務(wù)器環(huán)境下,根本沒有 IDE,這種情況下又該如何 Debug?本文分享 4 個(gè)沒有 IDE 情況下的 Debug 技巧。
1、print
print 可以說非常簡(jiǎn)單粗暴易懂,覺得哪個(gè)變量有問題,直接在終端里面打印出來就看到妖怪的原型了,借助于二分法,可以很快定位到代碼的問題。
2、assert
print 有個(gè)缺點(diǎn),你用完還要手動(dòng)刪除,如果你懶得刪除,就使用 asser 來斷言好了,當(dāng)你覺得某個(gè)變量必須是某值時(shí),就可以加上 assert,如果不是,這里就會(huì)拋出異常,這樣就定位到了問題。

3、日志?
有時(shí)候,我們不方便在終端中查看信息,尤其是多線程的 Web 應(yīng)用,此時(shí)就可以通過寫入日志的方法來 Debug 問題。這個(gè)類似于 print,不再多說。
4、pdb
要說真正的 Debug 工具,還要說 Python 自帶的 pdb 最為實(shí)用,掌握這個(gè),無論什么環(huán)境都不影響你 debug。
接下來,我們就一起來看看,pdb 在 Python 中到底應(yīng)該如何使用。首先,要啟動(dòng) pdb 調(diào)試,我們只需要在程序中,加入“import pdb”和“pdb.set_trace()”這兩行代碼就行了,比如下面這個(gè)簡(jiǎn)單的例子:
import?pdb
for?i?in?range(10000):
????print(i)
????if?i?==?800:
????????pdb.set_trace()
當(dāng)這個(gè)循環(huán)進(jìn)行到 i==800 時(shí),自動(dòng)停下來進(jìn)入命令行的調(diào)試,輸入 i 即可查詢變量的值,輸入 n 表示執(zhí)行下一行,輸入 ll 查看上下文,輸入 help 查看幫助。
......
799
800
>?/Users/aaronbrant/test.py(3)()
->?for?i?in?range(10000):
(Pdb)?i
800
(Pdb)?n
>?/Users/aaronbrant/test.py(4)()
->?print(i)
(Pdb)?n
801
>?/Users/aaronbrant/test.py(5)()
->?if?i?==?800:
(Pdb)?ll
??1??????import?pdb
??2
??3??????for?i?in?range(10000):
??4??????????print(i)
??5??->????????if?i?==?800:
??6??????????????pdb.set_trace()
(Pdb)?help
Documented?commands?(type?help?):
========================================
EOF????c??????????d????????h?????????list??????q????????rv???????undisplay
a??????cl?????????debug????help??????ll????????quit?????s????????unt
alias??clear??????disable??ignore????longlist??r????????source???until
args???commands???display??interact??n?????????restart??step?????up
b??????condition??down?????j?????????next??????return???tbreak???w
break??cont???????enable???jump??????p?????????retval???u????????whatis
bt?????continue???exit?????l?????????pp????????run??????unalias??where
如果使用 IDE,是否要點(diǎn)擊 800 次呢,我不是很清楚,沒試過,如果使用 IDE 來斷點(diǎn)定位至循環(huán)內(nèi)的 800 次,我會(huì)直接放棄,選用其他方式。
除此之外,你也可以不修改代碼,直接命令行使用 pdb 來 debug:
python?-m?pdb?123.pypdb 其他命令:
s 表示 step into,即進(jìn)入相對(duì)應(yīng)的代碼內(nèi)部。這時(shí),命令行中會(huì)顯示”--Call--“的字樣,當(dāng)你執(zhí)行完內(nèi)部的代碼塊后,命令行中則會(huì)出現(xiàn)”--Return--“的字樣。 r 表示 step out,即繼續(xù)執(zhí)行,直到當(dāng)前的函數(shù)完成返回。 b 可以用來設(shè)置斷點(diǎn)。比方說,我想要在代碼中的第 10 行,再加一個(gè)斷點(diǎn),那么在 pdb 模式下輸入”b 11“即可。 c 則表示一直執(zhí)行程序,直到遇到下一個(gè)斷點(diǎn)。
當(dāng)然,除了這些常用命令,還有許多其他的命令可以使用,這里我就不在一一贅述了。你可以參考對(duì)應(yīng)的官方文檔(https://docs.python.org/3/library/pdb.html#module-pdb),來熟悉這些用法。
最后的話
本文分享了 4 個(gè)不依賴 IDE 的調(diào)試技巧,前三個(gè)非常簡(jiǎn)單,最后一個(gè) pdb 學(xué)習(xí)成本稍高。如果要我選一個(gè)的話,我會(huì)選擇日志這樣的方式:將必要的變量及報(bào)錯(cuò)的堆棧信息都保存在日志文件中,當(dāng)我們的程序報(bào)錯(cuò)時(shí),所有必要的證據(jù)已經(jīng)收集完畢,不需要再花心思復(fù)原現(xiàn)場(chǎng),對(duì)著日志看下代碼邏輯就可以更快的發(fā)現(xiàn)并解決問題。
如果有收獲,還請(qǐng)點(diǎn)贊、關(guān)注、轉(zhuǎn)發(fā),感謝閱讀。
推薦閱讀:
