<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2821字,需瀏覽 6分鐘

           ·

          2022-06-21 14:44


          作者 | Rocky0429
          來源 | Python空間

          不管用什么語言在編寫程序的時候,總會出現(xiàn)形形色色的 bug,由于程序員經(jīng)常被玩壞,各種屬于程序員的“俚語”也被大眾熟知,出現(xiàn)了 bug 估計連我隔壁老王的三姨媽的四表舅的遠房表姐的鄰居的同學(xué)的妹夫的外婆的還在喝奶的侄女都知道要 debug,問題是 debug 說的容易,如何“de”,估計很多人還是一腦門兒


          在遙遠的 n 年前,那個時候我還是個憨批,阿不,是個蒟蒻。那個時候我在 寫 C 語言(我的第一門編程語言)的時候,出現(xiàn)了 bug 用 printf 查錯,可能寫的程序又多又爛,printf 被我用的爐火純青,出神入化,debug 的速度比我洗腦殼的時間還要快上一分。


          Python 的手段比當(dāng)年 C 的手段還多了不少,除了“打印”(print)以外,還可以配合 assert、log 來分析錯誤原因,再加上單元測試效率還是四顆星的。但是這種方式,更多的適合“自娛自樂”的情況。啥是自娛自樂,就是這段代碼是你寫的,你知道代碼什么意思,而且最好這個代碼比較...短。


          后來入了 ACM 的坑,有了能讓我抱大腿的隊友,成了一位光榮的劃水選手。我不能只看自己的代碼了,我的 printf 如陷入了泥沼中,寸步難行,在“大腿”鄙視的眼神中,被安利了「單步調(diào)試」,它的絲滑讓我欲罷不能,只能用這兩個字形容:


          因為對它的迷戀,在學(xué) Python 的第一時間,我就查了如何調(diào)試 Python 代碼,我發(fā)現(xiàn) Python 對于 debug 的支持還是很給勁的,常用的有兩種:pdb 調(diào)試和斷點 + 單步調(diào)試。


          0x00 pdb 調(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 這個按鈕:



          單擊 Step Over 這個按鈕之后,代碼會跳到下一行,這時代表著第一行代碼已經(jīng)執(zhí)行完畢,此時在 Debugger 面板顯示如下:



          在上圖中我們看到了在程序運行狀態(tài)下變量中的值,這樣一來,程序的運行過程對于我們來說就變的很透明了,我們就可以看到在運行過程中這個值是不是我們期望的值,如果不是,那這就是出 Bug 的原因。

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



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



          天吶個天,Debugger 面板中什么都沒了...


          不要慌,這都是有緣由的。還記得在那很久很久以前,我給大家講的變量么...


          忘記沒事,聽我再慢慢道來...

          這要從盤古開天辟地,阿不,女媧補天說起...

          變量是啥子呢?我們知道變量是存儲數(shù)據(jù)的。但是變量它住在哪呢?住在內(nèi)存里,當(dāng)然這個住只能是暫住,畢竟內(nèi)存就這么大點兒,都賴著不走那內(nèi)存很快就滿了。它臨時存儲再內(nèi)存當(dāng)中,啥叫臨時存儲,就是到點兒了就趕你走,變量的"到點兒"就是程序執(zhí)行完的時候,那個時候內(nèi)存中的變量就沒了,所以我們就什么也看不到了。

          Debugger 面板完事兒了,下面就該看 Console 面板了:


          當(dāng)我們切換到 Console 面板的時候,我們看到了兩個 print 輸出的結(jié)果(兩個結(jié)果是在一步步 Step Over 的過程中,每執(zhí)行完一個 print 之后產(chǎn)生一個對應(yīng)的結(jié)果)。

          使用斷點 + 單步調(diào)試的方法可以很完美的展示程序"自上而下"執(zhí)行這一特征,同時可以查看程序的執(zhí)行細節(jié)、變量類型和數(shù)據(jù)輸出這些內(nèi)容,可以更快速的找出 bug,理解程序運行的過程,省時省力又省心。

          文章中我用了很簡單的一段代碼來演示在 Pycharm 中如何打斷點,如何單步調(diào)試,其實對于復(fù)雜的程序,也是由一個個簡單的代碼塊堆積起來,掌握了方法,多寫 bug,阿不,多用調(diào)試方法,相信隨著這個過程的進行,你一定能成為一個 debug 小能手。

          課程推薦

          課程:《Python3 入門課程》

          課程介紹:本課程學(xué)完,你將可以掌握Python3的基礎(chǔ)知識;掌握Python3的應(yīng)用技巧;為學(xué)習(xí)Python3其他技術(shù)打下堅實基礎(chǔ)等。

          課程特點:

          1. 90+知識點圖文呈現(xiàn),為理解服務(wù);

          2. 90+隨堂練習(xí),踐行在“做”中“學(xué)”;

          3. 代碼塊案例豐富,講練結(jié)合。

          學(xué)習(xí)方式:掃碼 ↓ 立即前往課程界面~

          點擊閱讀原文,立即前往課程界面~
          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91 国产 爽 黄 在线相亲 | 音影先锋色色 - | 日韩美女性爱 | 亚洲a在线视频 | 国产免费1区 |