<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>

          如果沒有 IDE,該如何 Debug?

          共 2527字,需瀏覽 6分鐘

           ·

          2021-11-20 09:25

          寫代碼時(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.py

          pdb 其他命令:

          • 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ā),感謝閱讀。


          推薦閱讀:

          求求你,別用 print 來 debug 了

          在Python中正確的使用斷言-assert

          效率神器-快速定位最慢的代碼

          瀏覽 51
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  欧美第1页 | 操逼亚洲 | 欧美逼网 | www亚洲无 码A片 | 五月婷婷综合视频 |