faulthandler — 轉儲 Python 回溯

3.3 版本新增。


此模組包含在發生故障、超時後或在使用者訊號上顯式轉儲 Python 回溯的函式。呼叫 faulthandler.enable() 來為 SIGSEGVSIGFPESIGABRTSIGBUSSIGILL 訊號安裝故障處理程式。您還可以透過設定 PYTHONFAULTHANDLER 環境變數或使用 -X faulthandler 命令列選項在啟動時啟用它們。

故障處理程式與系統故障處理程式(如 Apport 或 Windows 故障處理程式)相容。如果 sigaltstack() 函式可用,則該模組會為訊號處理程式使用備用堆疊。這使得它即使在堆疊溢位時也能轉儲回溯。

故障處理程式在災難性情況下被呼叫,因此只能使用訊號安全函式(例如,它不能在堆上分配記憶體)。由於此限制,與普通的 Python 回溯相比,回溯轉儲是最小的

  • 僅支援 ASCII。在編碼時使用 backslashreplace 錯誤處理程式。

  • 每個字串的長度限制為 500 個字元。

  • 僅顯示檔名、函式名和行號。(沒有原始碼)

  • 它限制為 100 個幀和 100 個執行緒。

  • 順序是相反的:最近的呼叫首先顯示。

預設情況下,Python 回溯寫入 sys.stderr。要查看回溯,應用程式必須在終端中執行。或者,可以將日誌檔案傳遞給 faulthandler.enable()

該模組是用 C 實現的,因此可以在崩潰或 Python 死鎖時轉儲回溯。

Python 開發模式 在 Python 啟動時呼叫 faulthandler.enable()

另請參閱

模組 pdb

用於 Python 程式的互動式原始碼偵錯程式。

模組 traceback

用於提取、格式化和列印 Python 程式堆疊跟蹤的標準介面。

轉儲回溯

faulthandler.dump_traceback(file=sys.stderr, all_threads=True)

將所有執行緒的回溯轉儲到 file 中。如果 all_threadsFalse,則僅轉儲當前執行緒。

另請參閱

traceback.print_tb(),可用於列印回溯物件。

在 3.5 版本中更改: 添加了對此函式傳遞檔案描述符的支援。

故障處理程式狀態

faulthandler.enable(file=sys.stderr, all_threads=True)

啟用故障處理程式:為 SIGSEGVSIGFPESIGABRTSIGBUSSIGILL 訊號安裝處理程式,以轉儲 Python 回溯。如果 all_threadsTrue,則為每個正在執行的執行緒生成回溯。否則,僅轉儲當前執行緒。

file 必須保持開啟狀態,直到停用故障處理程式:請參閱 檔案描述符問題

在 3.5 版本中更改: 添加了對此函式傳遞檔案描述符的支援。

在 3.6 版本中更改: 在 Windows 上,還安裝了 Windows 異常的處理程式。

在 3.10 版本中更改: 如果 all_threads 為 true,則轉儲現在會提及是否正在執行垃圾回收。

faulthandler.disable()

停用故障處理程式:解除安裝由 enable() 安裝的訊號處理程式。

faulthandler.is_enabled()

檢查是否啟用了故障處理程式。

超時後轉儲回溯

faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)

timeout 秒的超時後,或如果 repeatTrue,則每隔 timeout 秒轉儲所有執行緒的回溯。如果 exitTrue,則在轉儲回溯後呼叫 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_threadsFalse,則僅轉儲當前執行緒的回溯。如果 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