91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何實現斷點調試

發布時間:2023-02-22 16:28:13 來源:億速云 閱讀:130 作者:iii 欄目:開發技術

這篇文章主要講解了“python如何實現斷點調試”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python如何實現斷點調試”吧!

?  什么是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 &hellip; ....> 錯誤

實例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 同時提供了較為完善的調試功能,支持多線程,遠程調試等,可以支持斷點設置,單步模式,表達式求值,變量查看等一系列功能

python如何實現斷點調試

?  Step Over, Step Into和Step Out 

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

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

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

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

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

python如何實現斷點調試

實例1.Step Over的效果

python如何實現斷點調試

實例2.Step Into的效果

python如何實現斷點調試

點擊Step Into下一步

python如何實現斷點調試

 點擊Step Into下一步

python如何實現斷點調試

 點擊Step Into下一步

python如何實現斷點調試

實例3.Step Out的效果

python如何實現斷點調試

感謝各位的閱讀,以上就是“python如何實現斷點調試”的內容了,經過本文的學習后,相信大家對python如何實現斷點調試這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诸暨市| 沾益县| 延安市| 伊金霍洛旗| 定结县| 出国| 化隆| 大厂| 忻州市| 成安县| 武胜县| 黄石市| 宁德市| 仙游县| 昔阳县| 花莲市| 永善县| 扶沟县| 增城市| 庆安县| 当雄县| 开远市| 瓮安县| 靖远县| 黄山市| 民县| 阜平县| 阜阳市| 惠安县| 城口县| 温宿县| 阆中市| 开化县| 南宫市| 共和县| 洪湖市| 锡林郭勒盟| 平乡县| 富民县| 巴林右旗| 修文县|