對于 bug 鋪天蓋地的 Python 程序,該如何高效的調(diào)試?





pdb 是 Python 自帶的庫,為 Python 提供了一種交互式的源碼調(diào)試功能,包含當(dāng)前調(diào)試器應(yīng)有的功能,包括設(shè)置斷點、單步調(diào)試、查看源碼等。其實如果你之前學(xué)過 C/C++ 的話,你可能知道 gdb 這個命令行調(diào)試工具,如果你之前用過 gdb,那么恭喜你你可以直接用 pdb 了,因為兩個用法是一樣的。
其實還有一個開源的 Python 調(diào)試器 -- ipdb,它和 pdb 的接口是一樣的,但是 ipdb 相比于 pdb 多了語法高亮,tab 自動補全等友好功能,在易用性方面做了很大的改進,這個感覺就和 Python 和 IPython 一樣。
關(guān)于 pdb 調(diào)試和 ipdb 調(diào)試的用法,我在以前的文章中也寫過,感興趣的可以看一下:
Python 調(diào)試器,一個優(yōu)秀開發(fā)人員的必備技能包。
0x01 斷點 + 單步調(diào)試
這個更多的是在圖形界面下的調(diào)試,很多 IDE 都支持 Python,調(diào)試功能都很完善,這里我主要介紹在 Pycharm 下的調(diào)試,畢竟 Pycharm 可以說是當(dāng)前最好用的 Python IDE。
斷點
在斷點這個地方,主要分為兩步:「找斷點」和「打斷點」。
找斷點,就是你想調(diào)試的代碼塊的第一行代碼即可,也就是一個斷點接足夠了,找到以后就可以打斷點了??赡苡型瑢W(xué)就有這么一個問題:
我都不知道是哪部分出了問題,我哪知道我要調(diào)試哪段代碼?

好像有點道理,不要慌,問題不大。首先你在關(guān)鍵的代碼位置上 print,然后通過分析 print 的值來縮小范圍,當(dāng)然這個過程你要穩(wěn)住,可能需要重復(fù)多次,一般這樣就可以將范圍縮小到一個比較完整的功能代碼塊中,然后就打斷點好了。
所以知道為啥叫“打”斷點了吧,誰讓它那么難找...

下面來說打斷點的方法,就是單擊目標代碼的行號右邊空白處,然后出現(xiàn)一個紅紅的圈,就證明打斷點成功了,請看下圖:

單步調(diào)試
斷點打完了,那么就該「單步調(diào)試」了。
調(diào)試的方法非常簡單,就是在當(dāng)前的 py 文件內(nèi)部點鼠標右鍵,單擊“Debug xxx”(xxx 是 py 文件名):

此時 Pycharm 會調(diào)出一個控制臺,這個控制臺大概分為顯示內(nèi)容的區(qū)域和工具區(qū)域:

其中工具區(qū)域有兩個面板:Debugger 和 Console。對于 Debugger 面板,它的內(nèi)容是在內(nèi)容區(qū)域顯示,顯示的為程序執(zhí)行過程中的變量及細節(jié);Console 面板則是輸出數(shù)據(jù)顯示的位置。
對于我們的代碼,如果到調(diào)試狀態(tài),該行代碼就處于一個凍結(jié)的狀態(tài),在點擊"按步操作"之后,才會一行一行代碼執(zhí)行。
主要用到 Step Over 這個按鈕:


然后我們繼續(xù)單擊 Step Over 按鈕,一直到最后一步:

然后你會在 Debugger 面板內(nèi)看到所有的變量及其值和類型,然后我們再來單擊 Step Over 按鈕,讓我們來看一下發(fā)生了什么:







課程:《Python3 入門課程》
課程介紹:本課程學(xué)完,你將可以掌握Python3的基礎(chǔ)知識;掌握Python3的應(yīng)用技巧;為學(xué)習(xí)Python3其他技術(shù)打下堅實基礎(chǔ)等。
課程特點:
90+知識點圖文呈現(xiàn),為理解服務(wù);
90+隨堂練習(xí),踐行在“做”中“學(xué)”;
代碼塊案例豐富,講練結(jié)合。
學(xué)習(xí)方式:掃碼 ↓ 立即前往課程界面~

