Python 如何調(diào)試程序崩潰錯(cuò)誤
問(wèn)題
你的程序崩潰后該怎樣去調(diào)試它?
解決方案
如果你的程序因?yàn)槟硞€(gè)異常而崩潰,運(yùn)行 python3 -i someprogram.py 可執(zhí)行簡(jiǎn)單的調(diào)試。 -i 選項(xiàng)可讓程序結(jié)束后打開(kāi)一個(gè)交互式shell。 然后你就能查看環(huán)境,例如,假設(shè)你有下面的代碼:
# sample.py
def func(n):
return n + 10
func('Hello')
運(yùn)行 python3 -i sample.py 會(huì)有類似如下的輸出:
bash % python3 -i sample.py
Traceback (most recent call last):
File "sample.py", line 6, in <module>
func('Hello')
File "sample.py", line 4, in func
return n + 10
TypeError: Can't convert 'int' object to str implicitly
>>> func(10)
20
>>>
如果你看不到上面這樣的,可以在程序崩潰后打開(kāi)Python的調(diào)試器。例如:
>>> import pdb
>>> pdb.pm()
> sample.py(4)func()
-> return n + 10
(Pdb) w
sample.py(6)<module>()
-> func('Hello')
> sample.py(4)func()
-> return n + 10
(Pdb) print n
'Hello'
(Pdb) q
>>>
如果你的代碼所在的環(huán)境很難獲取交互shell(比如在某個(gè)服務(wù)器上面), 通常可以捕獲異常后自己打印跟蹤信息。例如:
import traceback
import sys
try:
func(arg)
except:
print('**** AN ERROR OCCURRED ****')
traceback.print_exc(file=sys.stderr)
要是你的程序沒(méi)有崩潰,而只是產(chǎn)生了一些你看不懂的結(jié)果, 你在感興趣的地方插入一下 print() 語(yǔ)句也是個(gè)不錯(cuò)的選擇。 不過(guò),要是你打算這樣做,有一些小技巧可以幫助你。 首先,traceback.print_stack() 函數(shù)會(huì)你程序運(yùn)行到那個(gè)點(diǎn)的時(shí)候創(chuàng)建一個(gè)跟蹤棧。例如:
>>> def sample(n): ... if n > 0: ... sample(n-1) ... else: ... traceback.print_stack(file=sys.stderr) ... >>> sample(5) File "<stdin>", line 1, in <module> File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 5, in sample >>>
另外,你還可以像下面這樣使用 pdb.set_trace() 在任何地方手動(dòng)的啟動(dòng)調(diào)試器:
import pdb def func(arg): ... pdb.set_trace() ...
當(dāng)程序比較大而你想調(diào)試控制流程以及函數(shù)參數(shù)的時(shí)候這個(gè)就比較有用了。 例如,一旦調(diào)試器開(kāi)始運(yùn)行,你就能夠使用 print 來(lái)觀測(cè)變量值或敲擊某個(gè)命令比如 w 來(lái)獲取追蹤信息。
討論
不要將調(diào)試弄的過(guò)于復(fù)雜化。一些簡(jiǎn)單的錯(cuò)誤只需要觀察程序堆棧信息就能知道了, 實(shí)際的錯(cuò)誤一般是堆棧的最后一行。 你在開(kāi)發(fā)的時(shí)候,也可以在你需要調(diào)試的地方插入一下 print() 函數(shù)來(lái)診斷信息(只需要最后發(fā)布的時(shí)候刪除這些打印語(yǔ)句即可)。
調(diào)試器的一個(gè)常見(jiàn)用法是觀測(cè)某個(gè)已經(jīng)崩潰的函數(shù)中的變量。 知道怎樣在函數(shù)崩潰后進(jìn)入調(diào)試器是一個(gè)很有用的技能。
當(dāng)你想解剖一個(gè)非常復(fù)雜的程序,底層的控制邏輯你不是很清楚的時(shí)候, 插入 pdb.set_trace() 這樣的語(yǔ)句就很有用了。
實(shí)際上,程序會(huì)一直運(yùn)行到碰到 set_trace() 語(yǔ)句位置,然后立馬進(jìn)入調(diào)試器。 然后你就可以做更多的事了。
如果你使用IDE來(lái)做Python開(kāi)發(fā),通常IDE都會(huì)提供自己的調(diào)試器來(lái)替代pdb。 更多這方面的信息可以參考你使用的IDE手冊(cè)。
以上就是Python 如何調(diào)試程序崩潰錯(cuò)誤的詳細(xì)內(nèi)容,更多關(guān)于Python調(diào)試程序崩潰錯(cuò)誤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python 程序報(bào)錯(cuò)崩潰后如何倒回到崩潰的位置(推薦)
- jupyter notebook 使用過(guò)程中python莫名崩潰的原因及解決方式
- python實(shí)現(xiàn)監(jiān)控某個(gè)服務(wù) 服務(wù)崩潰即發(fā)送郵件報(bào)告
- 解決python多線程報(bào)錯(cuò):AttributeError: Can''t pickle local object問(wèn)題
- Python3下錯(cuò)誤AttributeError: ‘dict’ object has no attribute’iteritems‘的分析與解決
- python錯(cuò)誤:AttributeError: ''module'' object has no attribute ''setdefaultencoding''問(wèn)題的解決方法
- Python進(jìn)程崩潰AttributeError異常問(wèn)題解決
相關(guān)文章
Python爬蟲(chóng)教程之利用正則表達(dá)式匹配網(wǎng)頁(yè)內(nèi)容
這篇文章主要給大家介紹了關(guān)于Python爬蟲(chóng)教程之利用正則表達(dá)式匹配網(wǎng)頁(yè)內(nèi)容的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python+Selenium實(shí)現(xiàn)瀏覽器標(biāo)簽頁(yè)的切換
在實(shí)際工作中,我們經(jīng)常會(huì)遇到頁(yè)面切換的情況。就比如當(dāng)點(diǎn)擊了某個(gè)功能的按鈕后,瀏覽器出現(xiàn)了新的標(biāo)簽頁(yè),需要在這些標(biāo)簽頁(yè)之間進(jìn)行切換。本文將利用Selenium實(shí)現(xiàn)這一功能,需要的可以參考一下2022-06-06
python中找出numpy array數(shù)組的最值及其索引方法
下面小編就為大家分享一篇python中找出numpy array數(shù)組的最值及其索引方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python封裝json格式字符串并處理單雙引號(hào)問(wèn)題
大家好,本篇文章主要講的是python封裝json格式字符串并處理單雙引號(hào)問(wèn)題,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
如何搜索查找并解決Django相關(guān)的問(wèn)題
每個(gè)程序員都會(huì)在開(kāi)發(fā)過(guò)程中遇到這樣或那樣的問(wèn)題, 有時(shí)光靠一個(gè)人是無(wú)法解決所有問(wèn)題的, 所以我們應(yīng)該找到適當(dāng)?shù)牡胤教釂?wèn).2014-06-06
pandas刪除行刪除列增加行增加列的實(shí)現(xiàn)
這篇文章主要介紹了pandas刪除行刪除列增加行增加列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Django Rest framework認(rèn)證組件詳細(xì)用法
這篇文章主要介紹了Django Rest framework認(rèn)證組件詳細(xì)用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

