欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法

 更新時(shí)間:2023年02月22日 15:16:20   作者:橙子味冰可樂  
本文主要介紹了python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

當(dāng)程序中出現(xiàn)錯(cuò)誤時(shí)怎么解決?也就是我們所說的bug(缺陷),以及工作中如何對bug進(jìn)行調(diào)試

?  什么是bug(缺陷)

軟件缺陷就是通常說的bug,它是指在軟件中(包括文檔和程序)存在的影響軟件正常運(yùn)行的問題

缺陷的原因:

  • 編碼問題
  • 項(xiàng)目日期限短
  • 使用新技術(shù)

?  python代碼的調(diào)試方式

使用print語句打印出來

在編輯工具中,加斷點(diǎn)跟蹤(打斷點(diǎn))

使用日志模塊,輸出到日志中

下面我們來看看怎么打斷點(diǎn)

Debug 對于任何開發(fā)人員都是一項(xiàng)非常重要的技能,它能夠幫助我們準(zhǔn)確的定位錯(cuò)誤,發(fā)現(xiàn)程序中的 bug。python 提供了一系列 debug 的工具和包,可供我們選擇。

?  使用 pdb 進(jìn)行調(diào)試

pdb 是 python 自帶的一個(gè)包,為 python 程序提供了一種交互的源代碼調(diào)試功能,主要特性包括設(shè)置斷點(diǎn)、單步調(diào)試、進(jìn)入函數(shù)調(diào)試、查看當(dāng)前代碼、查看棧片段、動態(tài)改變變量的值等。pdb 提供了一些常用的調(diào)試命令

命令解釋
break 或 b 設(shè)置斷點(diǎn)設(shè)置斷點(diǎn)
continue 或 c繼續(xù)執(zhí)行程序
list 或 l查看當(dāng)前行的代碼段
step 或 s進(jìn)入函數(shù)
return 或 r執(zhí)行代碼直到從當(dāng)前函數(shù)返回
exit 或 q中止并退出
next 或 n執(zhí)行下一行
pp打印變量的值
help幫助

下面結(jié)合具體的實(shí)例講述如何使用 pdb 進(jìn)行調(diào)試 

實(shí)例1.測試代碼示例

import pdb 
a = "aaa"
pdb.set_trace() 
b = "bbb"
c = "ccc"
final = a + b + c 
print(final)

開始調(diào)試:直接運(yùn)行腳本,會停留在 pdb.set_trace() 處,選擇 n+enter 可以執(zhí)行當(dāng)前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重復(fù)執(zhí)行上一條 debug 命令

實(shí)例2.利用 pdb 調(diào)試

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (Pdb) list 
  1     import pdb 
  2     a = "aaa"
  3     pdb.set_trace() 
  4     b = "bbb"
  5     c = "ccc"
  6  -> final = a + b + c 
  7     print(final) 
 [EOF] 
 (Pdb) 
 [EOF] 
 (Pdb) n 
 > /root/epdb1.py(7)?() 
 -> print(final)
 (Pdb)

退出 debug:使用 quit 或者 q 可以退出當(dāng)前的 debug,但是 quit 會以一種非常粗魯?shù)姆绞酵顺龀绦?,其結(jié)果是直接 crash。

實(shí)例3.退出 debug

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) q 
 Traceback (most recent call last): 
  File "epdb1.py", line 5, in ? 
    c = "ccc"
  File "epdb1.py", line 5, in ? 
    c = "ccc"
  File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
  File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
 bdb.BdbQuit

打印變量的值:如果需要在調(diào)試過程中打印變量的值,可以直接使用 p 加上變量名,但是需要注意的是打印僅僅在當(dāng)前的 statement 已經(jīng)被執(zhí)行了之后才能看到具體的值,否則會報(bào) NameError: < exceptions.NameError … ....> 錯(cuò)誤

實(shí)例4. debug 過程中打印變量

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) p b 
'bbb'
 (Pdb) 
'bbb'
 (Pdb) n 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (Pdb) p c 
'ccc'
 (Pdb) p final 
 *** NameError: <exceptions.NameError instance at 0x1551b710 > 
 (Pdb) n 
 > /root/epdb1.py(7)?() 
 -> print(final)
 (Pdb) p final 
'aaabbbccc'
 (Pdb)

使用 c 可以停止當(dāng)前的 debug 使程序繼續(xù)執(zhí)行。如果在下面的程序中繼續(xù)有 set_statement() 的申明,則又會重新進(jìn)入到 debug 的狀態(tài),讀者可以在代碼 print(final) 之前再加上 set_trace() 驗(yàn)證。

實(shí)例5.停止 debug 繼續(xù)執(zhí)行程序

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) c 
 aaabbbccc

顯示代碼:在 debug 的時(shí)候不一定能記住當(dāng)前的代碼塊,如要要查看具體的代碼塊,則可以通過使用 list 或者 l 命令顯示。list 會用箭頭 -> 指向當(dāng)前 debug 的語句。

實(shí)例6.debug 過程中顯示代碼

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) list 
  1     import pdb 
  2     a = "aaa"
  3     pdb.set_trace() 
  4  -> b = "bbb"
  5     c = "ccc"
  6     final = a + b + c 
  7     pdb.set_trace() 
  8     print(final)  
 [EOF] 
 (Pdb) c 
 > /root/epdb1.py(8)?() 
 -> print final 
 (Pdb) list 
  3     pdb.set_trace() 
  4     b = "bbb"
  5     c = "ccc"
  6     final = a + b + c 
  7     pdb.set_trace() 
  8  -> print(final) 
 [EOF] 
 (Pdb)

在使用函數(shù)的情況下進(jìn)行 debug

實(shí)例7.使用函數(shù)的例子

import pdb 
 def combine(s1,s2):      
    s3 = s1 + s2 + s1    
    s3 = '"' + s3 +'"'   
    return s3           
 a = "aaa"
 pdb.set_trace() 
 b = "bbb"
 c = "ccc"
 final = combine(a,b) 
 print(final) 

如果直接使用 n 進(jìn)行 debug 則到 final=combine(a,b) 這句的時(shí)候會將其當(dāng)做普通的賦值語句處理,進(jìn)入到 print final。如果想要對函數(shù)進(jìn)行 debug 如何處理呢 ? 可以直接使用 s 進(jìn)入函數(shù)塊。函數(shù)里面的單步調(diào)試與上面的介紹類似。如果不想在函數(shù)里單步調(diào)試可以在斷點(diǎn)處直接按 r 退出到調(diào)用的地方。

實(shí)例8.對函數(shù)進(jìn)行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb2.py(11)?() 
 -> c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(12)?() 
 -> final = combine(a,b) 
 (Pdb) s 
 --Call-- 
 > /root/epdb2.py(3)combine() 
 -> def combine(s1,s2):     
 (Pdb) n 
 > /root/epdb2.py(4)combine() 
 -> s3 = s1 + s2 + s1    
 (Pdb) list 
  1     import pdb 
  2 
  3     def combine(s1,s2):      
  4  ->     s3 = s1 + s2 + s1    
  5         s3 = '"' + s3 +'"'   
  6         return s3            
  7 
  8     a = "aaa"
  9     pdb.set_trace() 
 10     b = "bbb"
 11     c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(5)combine() 
 -> s3 = '"' + s3 +'"'   
 (Pdb) n 
 > /root/epdb2.py(6)combine() 
 -> return s3            
 (Pdb) n 
 --Return-- 
 > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
 -> return s3           
 (Pdb) n 
 > /root/epdb2.py(13)?() 
 -> print(final)  
 (Pdb)

在調(diào)試的時(shí)候動態(tài)改變值 。在調(diào)試的時(shí)候可以動態(tài)改變變量的值,具體如下實(shí)例。需要注意的是下面有個(gè)錯(cuò)誤,原因是 b 已經(jīng)被賦值了,如果想重新改變 b 的賦值,則應(yīng)該使用 B。

實(shí)例9.在調(diào)試的時(shí)候動態(tài)改變值

[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) var = "1234"
 (Pdb) b = "avfe"
 *** The specified object '= "avfe"' is not a function 
 or was not found along sys.path. 
 (Pdb) !b="afdfd"
 (Pdb)

pdb 調(diào)試有個(gè)明顯的缺陷就是對于多線程,遠(yuǎn)程調(diào)試等支持得不夠好,同時(shí)沒有較為直觀的界面顯示,不太適合大型的 python 項(xiàng)目。而在較大的 python 項(xiàng)目中,這些調(diào)試需求比較常見,因此需要使用更為高級的調(diào)試工具。

接下來將介紹 PyCharm IDE 的調(diào)試方法 

?  使用 PyCharm 進(jìn)行調(diào)試

PyCharm 同時(shí)提供了較為完善的調(diào)試功能,支持多線程,遠(yuǎn)程調(diào)試等,可以支持?jǐn)帱c(diǎn)設(shè)置,單步模式,表達(dá)式求值,變量查看等一系列功能

?  Step Over, Step Into和Step Out 

Step Over:在單步執(zhí)行時(shí),在函數(shù)內(nèi)遇到子函數(shù)時(shí)不會進(jìn)入子函數(shù)內(nèi)單步執(zhí)行,而是將子函數(shù)整個(gè)執(zhí)行完再停止,也就是把子函數(shù)整個(gè)作為一步

注意:在不存在子函數(shù)的情況下Step Over是和Step Into效果一樣的

Step Into:單步執(zhí)行,遇到子函數(shù)就進(jìn)入并且繼續(xù)單步執(zhí)行(即進(jìn)入子函數(shù))

Step Out:當(dāng)單步執(zhí)行到子函數(shù)內(nèi)時(shí),用Step Out就可以執(zhí)行完子函數(shù)余下部分,并返回到上一層函數(shù)

在第14行調(diào)用devide函數(shù)時(shí)打斷點(diǎn)

實(shí)例1.Step Over的效果

實(shí)例2.Step Into的效果

點(diǎn)擊Step Into下一步

 點(diǎn)擊Step Into下一步

 點(diǎn)擊Step Into下一步

實(shí)例3.Step Out的效果

 到此這篇關(guān)于python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法的文章就介紹到這了,更多相關(guān)python 斷點(diǎn)調(diào)試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論