問題
解決方案
如果你的程序因為某個異常而崩潰,運行 python3 -i someprogram.py 可執行簡單的調試。 -i 選項可讓程序結束后打開一個交互式shell。 然后你就能查看環境,例如,假設你有下面的代碼:
1
2
3
4
5
6
|
# sample.py def func(n): return n + 10 func( 'Hello' ) |
運行 python3 -i sample.py 會有類似如下的輸出:
1
2
3
4
5
6
7
8
9
10
|
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 >>> |
如果你看不到上面這樣的,可以在程序崩潰后打開Python的調試器。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> 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 >>> |
如果你的代碼所在的環境很難獲取交互shell(比如在某個服務器上面), 通常可以捕獲異常后自己打印跟蹤信息。例如:
1
2
3
4
5
6
7
8
|
import traceback import sys try : func(arg) except : print ( '**** AN ERROR OCCURRED ****' ) traceback.print_exc( file = sys.stderr) |
要是你的程序沒有崩潰,而只是產生了一些你看不懂的結果, 你在感興趣的地方插入一下 print() 語句也是個不錯的選擇。 不過,要是你打算這樣做,有一些小技巧可以幫助你。 首先,traceback.print_stack() 函數會你程序運行到那個點的時候創建一個跟蹤棧。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>> 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() 在任何地方手動的啟動調試器:
1
2
3
4
5
6
|
import pdb def func(arg): ... pdb.set_trace() ... |
當程序比較大而你想調試控制流程以及函數參數的時候這個就比較有用了。 例如,一旦調試器開始運行,你就能夠使用 print 來觀測變量值或敲擊某個命令比如 w 來獲取追蹤信息。
討論
不要將調試弄的過于復雜化。一些簡單的錯誤只需要觀察程序堆棧信息就能知道了, 實際的錯誤一般是堆棧的最后一行。 你在開發的時候,也可以在你需要調試的地方插入一下 print() 函數來診斷信息(只需要最后發布的時候刪除這些打印語句即可)。
調試器的一個常見用法是觀測某個已經崩潰的函數中的變量。 知道怎樣在函數崩潰后進入調試器是一個很有用的技能。
當你想解剖一個非常復雜的程序,底層的控制邏輯你不是很清楚的時候, 插入 pdb.set_trace() 這樣的語句就很有用了。
實際上,程序會一直運行到碰到 set_trace() 語句位置,然后立馬進入調試器。 然后你就可以做更多的事了。
如果你使用IDE來做Python開發,通常IDE都會提供自己的調試器來替代pdb。 更多這方面的信息可以參考你使用的IDE手冊。
以上就是Python 如何調試程序崩潰錯誤的詳細內容,更多關于Python調試程序崩潰錯誤的資料請關注服務器之家其它相關文章!
原文鏈接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p12_debugging_basic_program_crashes.html