15.21 诊æ–分段错误¶
问题¶
è§£é‡Šå™¨å› ä¸ºæŸ�个分段错误ã€�总线错误ã€�访问越界或其他致命错误而çª�然间奔溃。 ä½ æƒ³èŽ·å¾—Pythonå †æ ˆä¿¡æ�¯ï¼Œä»Žè€Œæ‰¾å‡ºåœ¨å�‘ç”Ÿé”™è¯¯çš„æ—¶å€™ä½ çš„ç¨‹åº�è¿�行点。
解决方案¶
faulthandler 模å�—能被用æ�¥å¸®ä½ 解决这个问题。
åœ¨ä½ çš„ç¨‹åº�ä¸å¼•入下列代ç �:
import faulthandler
faulthandler.enable()
å�¦å¤–还å�¯ä»¥åƒ�下é�¢è¿™æ ·ä½¿ç”¨ -Xfaulthandler æ�¥è¿�行Python:
bash % python3 -Xfaulthandler program.py
最å�Žï¼Œä½ å�¯ä»¥è®¾ç½® PYTHONFAULTHANDLER 环境å�˜é‡�。
å¼€å�¯faulthandlerå�Žï¼Œåœ¨C扩展ä¸çš„致命错误会导致一个Pythoné”™è¯¯å †æ ˆè¢«æ‰“å�°å‡ºæ�¥ã€‚例如:
Fatal Python error: Segmentation fault
Current thread 0x00007fff71106cc0:
File "example.py", line 6 in foo
File "example.py", line 10 in bar
File "example.py", line 14 in spam
File "example.py", line 19 in <module>
Segmentation fault
尽管这个并ä¸�èƒ½å‘Šè¯‰ä½ C代ç �ä¸å“ªé‡Œå‡ºé”™äº†ï¼Œä½†æ˜¯è‡³å°‘èƒ½å‘Šè¯‰ä½ Python里é�¢å“ªé‡Œæœ‰é”™ã€‚
讨论¶
faulthandler会在Python代ç �执行出错的时候å�‘ä½ å±•ç¤ºè·Ÿè¸ªä¿¡æ�¯ã€‚ è‡³å°‘ï¼Œå®ƒä¼šå‘Šè¯‰ä½ å‡ºé”™æ—¶è¢«è°ƒç”¨çš„æœ€é¡¶çº§æ‰©å±•å‡½æ•°æ˜¯å“ªä¸ªã€‚ 在pdb和其他Pythonè°ƒè¯•å™¨çš„å¸®åŠ©ä¸‹ï¼Œä½ å°±èƒ½è¿½æ ¹æº¯æº�找到错误所在的ä½�置了。
faulthandlerä¸�ä¼šå‘Šè¯‰ä½ ä»»ä½•Cè¯è¨€ä¸çš„错误信æ�¯ã€‚ å› æ¤ï¼Œä½ 需è¦�ä½¿ç”¨ä¼ ç»Ÿçš„C调试器,比如gdb。 ä¸�过,在faulthandler追踪信æ�¯å�¯ä»¥è®©ä½ 去判æ–从哪里ç�€æ‰‹ã€‚ 还è¦�注æ„�的是在C䏿Ÿ�些类型的错误å�¯èƒ½ä¸�太容易æ�¢å¤�。 例如,如果一个C扩展丢弃了程åº�å †æ ˆä¿¡æ�¯ï¼Œå®ƒä¼šè®©faulthandlerä¸�å�¯ç”¨ï¼Œ é‚£ä¹ˆä½ ä¹Ÿå¾—ä¸�到任何输出(除了程åº�奔溃外)。