日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python實現斷點調試的方法_python

作者:橙子味冰可樂 ? 更新時間: 2023-06-02 編程語言

當程序中出現錯誤時怎么解決?也就是我們所說的bug(缺陷),以及工作中如何對bug進行調試

?? 什么是bug(缺陷)

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

缺陷的原因:

  • 編碼問題
  • 項目日期限短
  • 使用新技術

?? python代碼的調試方式

使用print語句打印出來

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

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

下面我們來看看怎么打斷點

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

???使用 pdb 進行調試

pdb 是 python 自帶的一個包,為 python 程序提供了一種交互的源代碼調試功能,主要特性包括設置斷點、單步調試、進入函數調試、查看當前代碼、查看棧片段、動態改變變量的值等。pdb 提供了一些常用的調試命令

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

下面結合具體的實例講述如何使用 pdb 進行調試?

實例1.測試代碼示例

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

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

實例2.利用 pdb 調試

[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 可以退出當前的 debug,但是 quit 會以一種非常粗魯的方式退出程序,其結果是直接 crash。

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

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

實例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 可以停止當前的 debug 使程序繼續執行。如果在下面的程序中繼續有 set_statement() 的申明,則又會重新進入到 debug 的狀態,讀者可以在代碼 print(final) 之前再加上 set_trace() 驗證。

實例5.停止 debug 繼續執行程序

[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 的時候不一定能記住當前的代碼塊,如要要查看具體的代碼塊,則可以通過使用 list 或者 l 命令顯示。list 會用箭頭 -> 指向當前 debug 的語句。

實例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)

在使用函數的情況下進行 debug

實例7.使用函數的例子

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 進行 debug 則到 final=combine(a,b) 這句的時候會將其當做普通的賦值語句處理,進入到 print final。如果想要對函數進行 debug 如何處理呢 ? 可以直接使用 s 進入函數塊。函數里面的單步調試與上面的介紹類似。如果不想在函數里單步調試可以在斷點處直接按 r 退出到調用的地方。

實例8.對函數進行 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)

在調試的時候動態改變值 。在調試的時候可以動態改變變量的值,具體如下實例。需要注意的是下面有個錯誤,原因是 b 已經被賦值了,如果想重新改變 b 的賦值,則應該使用?B。

實例9.在調試的時候動態改變值

[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 調試有個明顯的缺陷就是對于多線程,遠程調試等支持得不夠好,同時沒有較為直觀的界面顯示,不太適合大型的 python 項目。而在較大的 python 項目中,這些調試需求比較常見,因此需要使用更為高級的調試工具。

接下來將介紹 PyCharm IDE 的調試方法?

???使用 PyCharm 進行調試

PyCharm 同時提供了較為完善的調試功能,支持多線程,遠程調試等,可以支持斷點設置,單步模式,表達式求值,變量查看等一系列功能

?? Step Over,?Step Into和Step Out?

Step Over:在單步執行時,在函數內遇到子函數時不會進入子函數內單步執行,而是將子函數整個執行完再停止,也就是把子函數整個作為一步

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

Step Into:單步執行,遇到子函數就進入并且繼續單步執行(即進入子函數)

Step Out:當單步執行到子函數內時,用Step Out就可以執行完子函數余下部分,并返回到上一層函數

在第14行調用devide函數時打斷點

實例1.Step Over的效果

實例2.Step Into的效果

點擊Step Into下一步

?點擊Step Into下一步

?點擊Step Into下一步

實例3.Step Out的效果

原文鏈接:https://blog.csdn.net/weixin_67859959/article/details/129151240

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新