faulthandler
— 轉儲 Python 回溯¶
3.3 版本新增。
此模組包含在發生故障、超時後或在使用者訊號上顯式轉儲 Python 回溯的函式。呼叫 faulthandler.enable()
來為 SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
和 SIGILL
訊號安裝故障處理程式。您還可以透過設定 PYTHONFAULTHANDLER
環境變數或使用 -X
faulthandler
命令列選項在啟動時啟用它們。
故障處理程式與系統故障處理程式(如 Apport 或 Windows 故障處理程式)相容。如果 sigaltstack()
函式可用,則該模組會為訊號處理程式使用備用堆疊。這使得它即使在堆疊溢位時也能轉儲回溯。
故障處理程式在災難性情況下被呼叫,因此只能使用訊號安全函式(例如,它不能在堆上分配記憶體)。由於此限制,與普通的 Python 回溯相比,回溯轉儲是最小的
僅支援 ASCII。在編碼時使用
backslashreplace
錯誤處理程式。每個字串的長度限制為 500 個字元。
僅顯示檔名、函式名和行號。(沒有原始碼)
它限制為 100 個幀和 100 個執行緒。
順序是相反的:最近的呼叫首先顯示。
預設情況下,Python 回溯寫入 sys.stderr
。要查看回溯,應用程式必須在終端中執行。或者,可以將日誌檔案傳遞給 faulthandler.enable()
。
該模組是用 C 實現的,因此可以在崩潰或 Python 死鎖時轉儲回溯。
Python 開發模式 在 Python 啟動時呼叫 faulthandler.enable()
。
轉儲回溯¶
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)¶
將所有執行緒的回溯轉儲到 file 中。如果 all_threads 為
False
,則僅轉儲當前執行緒。另請參閱
traceback.print_tb()
,可用於列印回溯物件。在 3.5 版本中更改: 添加了對此函式傳遞檔案描述符的支援。
故障處理程式狀態¶
- faulthandler.enable(file=sys.stderr, all_threads=True)¶
啟用故障處理程式:為
SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
和SIGILL
訊號安裝處理程式,以轉儲 Python 回溯。如果 all_threads 為True
,則為每個正在執行的執行緒生成回溯。否則,僅轉儲當前執行緒。file 必須保持開啟狀態,直到停用故障處理程式:請參閱 檔案描述符問題。
在 3.5 版本中更改: 添加了對此函式傳遞檔案描述符的支援。
在 3.6 版本中更改: 在 Windows 上,還安裝了 Windows 異常的處理程式。
在 3.10 版本中更改: 如果 all_threads 為 true,則轉儲現在會提及是否正在執行垃圾回收。
- faulthandler.is_enabled()¶
檢查是否啟用了故障處理程式。
超時後轉儲回溯¶
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)¶
在 timeout 秒的超時後,或如果 repeat 為
True
,則每隔 timeout 秒轉儲所有執行緒的回溯。如果 exit 為True
,則在轉儲回溯後呼叫 status=1 的_exit()
。(注意_exit()
會立即退出程序,這意味著它不會執行任何清理操作,例如重新整理檔案緩衝區。)如果該函式被呼叫兩次,則新的呼叫會替換之前的引數並重置超時。計時器具有亞秒級解析度。file 必須保持開啟狀態,直到回溯被轉儲或呼叫
cancel_dump_traceback_later()
:請參閱 檔案描述符問題。此函式是使用看門狗執行緒實現的。
在 3.5 版本中更改: 添加了對此函式傳遞檔案描述符的支援。
在 3.7 版本中更改: 此函式現在始終可用。
- faulthandler.cancel_dump_traceback_later()¶
取消上次對
dump_traceback_later()
的呼叫。
在使用者訊號上轉儲回溯¶
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)¶
註冊使用者訊號:為 signum 訊號安裝一個處理程式,以將所有執行緒的回溯轉儲到 file 中,或者如果 all_threads 為
False
,則僅轉儲當前執行緒的回溯。如果 chain 為True
,則呼叫之前的處理程式。檔案必須保持開啟狀態,直到透過
unregister()
取消註冊訊號:請參閱 檔案描述符問題。在 Windows 上不可用。
在 3.5 版本中更改: 添加了對此函式傳遞檔案描述符的支援。
- faulthandler.unregister(signum)¶
取消註冊使用者訊號:解除安裝由
register()
安裝的 signum 訊號的處理程式。如果訊號已註冊,則返回True
,否則返回False
。在 Windows 上不可用。
檔案描述符問題¶
enable()
、dump_traceback_later()
和 register()
會保留其 file 引數的檔案描述符。如果檔案被關閉,並且其檔案描述符被新檔案重用,或者如果使用 os.dup2()
替換了檔案描述符,則回溯資訊將被寫入到不同的檔案中。每次檔案被替換時,請再次呼叫這些函式。
示例¶
在 Linux 上啟用和不啟用故障處理程式的情況下發生段錯誤的示例
$ python -c "import ctypes; ctypes.string_at(0)"
Segmentation fault
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700 (most recent call first):
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault