faulthandler
—— 轉儲 Python 的跟蹤信息?
3.3 新版功能.
當故障、超時(shí)或收到用戶(hù)信號時(shí),利用本模塊內的函數可轉儲 Python 跟蹤信息。調用 faulthandler.enable()
可安裝 SIGSEGV
、 SIGFPE
、 SIGABRT
、 SIGBUS
和 SIGILL
信號的故障處理程序。通過(guò)設置 PYTHONFAULTHANDLER
環(huán)境變量或 -X
faulthandler
命令行參數,還可以在啟動(dòng)時(shí)開(kāi)啟這些設置。
故障處理程序與操作系統的故障處理程序兼容,比如 Apport 或 Windows 故障處理程序等。如果 sigaltstack()
函數可用,本模塊將為信號處理程序使用備用堆棧。這樣即便堆棧溢出也能轉儲跟蹤信息。
故障處理程序將在災難性場(chǎng)合調用,因此只能使用信號安全的函數(比如不能在堆上分配內存)。由于這一限制,與正常的 Python 跟蹤相比,轉儲量是最小的。
只支持 ASCII 碼。編碼時(shí)會(huì )用到
backslashreplace
錯誤處理程序。每個(gè)字符串限制在 500 個(gè)字符以?xún)取?/p>
只會(huì )顯式文件名、函數名和行號。(不顯示源代碼)
上限是 100 頁(yè)內存幀和 100 個(gè)線(xiàn)程。
反序排列:最近的調用最先顯示。
默認情況下,Python 的跟蹤信息會(huì )寫(xiě)入 sys.stderr
。為了能看到跟蹤信息,應用程序必須運行于終端中。日志文件也可以傳給 faulthandler.enable()
。
本模塊是用 C 語(yǔ)言實(shí)現的,所以才能在崩潰或 Python 死鎖時(shí)轉儲跟蹤信息。
在 Python 啟動(dòng)時(shí), Python 開(kāi)發(fā)模式 會(huì )調用 faulthandler.enable()
。
轉儲跟蹤信息?
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)?
將所有線(xiàn)程的跟蹤數據轉儲到 file 中。如果 all_threads 為
False
,則只轉儲當前線(xiàn)程。在 3.5 版更改: 增加了向本函數傳入文件描述符的支持。
故障處理程序的狀態(tài)?
- faulthandler.enable(file=sys.stderr, all_threads=True)?
啟用故障處理程序:為
SIGSEGV
、SIGFPE
、SIGABRT
、SIGBUS
和SIGILL
信號安裝處理程序,以轉儲 Python 跟蹤信息。如果 all_threads 為True
,則會(huì )為每個(gè)運行中的線(xiàn)程生成跟蹤信息。否則只轉儲當前線(xiàn)程。file 必須保持打開(kāi)狀態(tài),直至停用故障處理程序為止:參見(jiàn) 文件描述符相關(guān)話(huà)題。
在 3.5 版更改: 增加了向本函數傳入文件描述符的支持。
在 3.6 版更改: 在 Windows 系統中,同時(shí)會(huì )安裝一個(gè) Windows 異常處理程序。
在 3.10 版更改: 現在如果 all_threads 為 True,則轉儲信息會(huì )包含垃圾收集器是否正在運行。
- faulthandler.is_enabled()?
檢查故障處理程序是否被啟用。
一定時(shí)間后轉儲跟蹤數據。?
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)?
在 timeout 秒超時(shí)后,轉儲所有線(xiàn)程的跟蹤信息,如果 repeat 為
True
,則每隔 timeout 秒轉儲一次。如果 exit 為True
,則在轉儲跟蹤信息后調用_exit()
,參數 status=1。請注意,_exit()
會(huì )立即關(guān)閉進(jìn)程,這意味著(zhù)不做任何清理工作,如刷新文件緩沖區等。如果調用兩次函數,則新的調用將取代之前的參數,超時(shí)時(shí)間也會(huì )重置。計時(shí)器的精度為亞秒級。file 必須保持打開(kāi)狀態(tài),直至跟蹤信息轉儲完畢,或調用了
cancel_dump_traceback_later()
:參見(jiàn) 文件描述符相關(guān)話(huà)題。本函數用一個(gè)看門(mén)狗線(xiàn)程實(shí)現。
在 3.7 版更改: 該函數現在總是可用。
在 3.5 版更改: 增加了向本函數傳入文件描述符的支持。
- faulthandler.cancel_dump_traceback_later()?
取消
dump_traceback_later()
的最后一次調用。
轉儲用戶(hù)信號的跟蹤信息。?
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)?
注冊一個(gè)用戶(hù)信號:為 signum 信號安裝一個(gè)處理程序,將所有線(xiàn)程或當前線(xiàn)程(all_threads 為
False
時(shí))的跟蹤信息轉儲到 file 中。如果 chain 為True
,則調用上一層處理程序。file 必須保持打開(kāi)狀態(tài),直至該信號被
unregister()
注銷(xiāo):參見(jiàn) 文件描述符相關(guān)話(huà)題。Windows 中不可用。
在 3.5 版更改: 增加了向本函數傳入文件描述符的支持。
- faulthandler.unregister(signum)?
注銷(xiāo)一個(gè)用戶(hù)信號:卸載由
register()
安裝的 signum 信號處理程序。如果信號已注冊,返回True
,否則返回False
。Windows 中不可用。
文件描述符相關(guān)話(huà)題?
enable()
、 dump_traceback_later()
和 register()
保留其 file 參數給出的文件描述符。 如果文件關(guān)閉,文件描述符將被一個(gè)新文件重新使用;或者用 os.dup2()
替換了文件描述符,則跟蹤信息將被寫(xiě)入另一個(gè)文件。 每次文件被替換時(shí),都會(huì )再次調用這些函數。
示例?
在 Linux 中啟用和停用內存段故障的默認處理程序:
$ python3 -c "import ctypes; ctypes.string_at(0)"
Segmentation fault
$ python3 -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