faulthandler — 파이썬 트레이스백 덤프¶
Added in version 3.3.
이 모듈은 결함(fault) 시, 시간 초과 후 또는 사용자 시그널에 파이썬 트레이스백을 명시적으로 덤프하는 함수를 포함합니다. SIGSEGV, SIGFPE, SIGABRT, SIGBUS 및 SIGILL 시그널에 대한 결함 처리기를 설치하려면 faulthandler.enable()를 호출하십시오. PYTHONFAULTHANDLER 환경 변수를 설정하거나 -X faulthandler 명령 줄 옵션을 사용하여 시작할 때 활성화할 수도 있습니다.
결함 처리기는 Apport나 윈도우 결함 처리기(Windows fault handler)와 같은 시스템 결함 처리기와 호환됩니다. 이 모듈은 sigaltstack() 함수를 사용할 수 있으면 시그널 처리기에 대체 스택을 사용합니다. 이것은 스택 오버플로에서조차 트레이스백을 덤프할 수 있도록 합니다.
결함 처리기는 치명적일 때 호출되므로 시그널 안전한 함수만 사용할 수 있습니다 (예를 들어, 힙에 메모리를 할당할 수 없습니다). 이 제한 때문에 일반적인 파이썬 트레이스백에 비해 트레이스백 덤프는 최소화됩니다:
ASCII만 지원됩니다. 인코딩 시
backslashreplace에러 처리기가 사용됩니다.각 문자열은 500자로 제한됩니다.
파일명, 함수 이름 및 줄 번호만 표시됩니다. (소스 코드 없음)
이는 스레드당 100프레임, 그리고 100개의 스레드( max_threads\를 통해 설정 가능)로 제한됩니다.
순서가 뒤집힙니다: 가장 최근의 호출이 먼저 표시됩니다.
기본적으로, 파이썬 트레이스백은 sys.stderr에 기록됩니다. 트레이스백을 보려면, 응용 프로그램이 터미널에서 실행되어야 합니다. 로그 파일을 faulthandler.enable()로 전달할 수도 있습니다.
모듈은 C로 구현되어 있으므로, 충돌 시나 파이썬이 교착 상태에 빠질 때 트레이스백을 덤프할 수 있습니다.
파이썬 개발 모드는 파이썬 시작 시 faulthandler.enable()을 호출합니다.
트레이스백 덤프하기¶
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True, *, max_threads=100)¶
file\에 모든 스레드의 트레이스백을 덤프합니다. all_threads\가
False\이면, 현재 스레드만 덤프합니다. max_threads\는 덤프되는 스레드 수를 제한합니다.더 보기
트레이스백 객체를 인쇄하는 데 사용될 수 있는 :func:`traceback.print_tb`입니다.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
버전 3.15에서 변경: max_threads 키워드 인수를 추가했습니다.
C 스택 덤프¶
Added in version 3.14.
- faulthandler.dump_c_stack(file=sys.stderr)¶
현재 스레드의 C 스택 트레이스백을 file\에 덤프합니다.
Python 빌드가 지원하지 않거나 운영 체제가 스택 트레이스를 제공하지 않는 경우, 여기에는 덤프된 C 스택 대신 오류가 표시됩니다.
C 스택 호환성¶
시스템이 C 레벨의 backtrace(3) 또는 :manpage:`dladdr1(3)`을 지원하지 않으면 C 스택 덤프가 작동하지 않습니다. 대신 오류가 인쇄됩니다.
추가적으로, 일부 컴파일러는 :term:`<CPython>`의 C 스택 덤프 구현을 지원하지 않습니다. 결과적으로 운영 체제가 스택 덤프를 지원하더라도 스택 대신 다른 오류가 인쇄될 수 있습니다.
참고
C 스택 덤프는 호출 스택의 DWARF 레벨에 따라 임의로 느릴 수 있습니다.
결함 처리기 상태¶
- faulthandler.enable(file=sys.stderr, all_threads=True, c_stack=True, *, max_threads=100)¶
결함 처리기를 활성화합니다:
SIGSEGV,SIGFPE,SIGABRT,SIGBUS및SIGILL시그널에 대한 처리기를 설치하여 파이썬 트레이스백을 덤프합니다. all_threads가True면 실행 중인 모든 스레드에 대한 트레이스백을 생성합니다. 그렇지 않으면, 현재 스레드만 덤프합니다.file은 결함 처리기가 비활성화될 때까지 열려 있어야 합니다: 파일 기술자 관련 문제를 참조하십시오.
c_stack\가
True\이면, 시스템이 이를 지원하지 않는 한 Python 트레이스백 다음에 C 스택 트레이스가 인쇄됩니다. 호환성에 대한 추가 정보는 :func:`dump_c_stack`을 참조하십시오.max_threads\는 치명적인 신호가 발생할 때 덤프되는 스레드 수를 제한합니다.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
버전 3.6에서 변경: 윈도우에서는, 윈도우 예외(Windows exception) 처리기도 설치됩니다.
버전 3.10에서 변경: all_threads\가 true인 경우 이제 가비지 컬렉터 컬렉션이 실행 중인지 여부를 덤프합니다.
버전 3.14에서 변경: GIL\이 비활성화되면 데이터 경쟁의 위험을 방지하기 위해 현재 스레드만 덤프됩니다.
버전 3.14에서 변경: c_stack\가 true인 경우 이제 C 스택 트레이스를 표시합니다.
버전 3.15에서 변경: max_threads 키워드 인수를 추가했습니다.
- faulthandler.is_enabled()¶
결함 처리기가 활성화되었는지 검사합니다.
시간 초과 후에 트레이스백 덤프하기¶
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False, *, max_threads=100)¶
timeout 초의 시간제한 후, 또는 repeat 가
True이면 매 timeout 초마다, 모든 스레드의 트레이스백을 덤프합니다. exit 가True이면, 트레이스백을 덤프한 후 status=1 로_exit()를 호출합니다. (참고:_exit()는 프로세스를 즉시 종료하며, 이는 파일 버퍼 플러시와 같은 정리 작업을 수행하지 않음을 의미합니다.) 함수가 두 번 호출되면, 새로운 호출은 이전 매개 변수를 대체하고 시간제한을 재설정합니다. 타이머는 1초 미만의 해상도를 가집니다. max_threads 는 덤프되는 스레드 수를 제한합니다.file은 트레이스백이 덤프 되거나
cancel_dump_traceback_later()가 호출될 때까지 열려 있어야 합니다: 파일 기술자 관련 문제를 참조하십시오.이 함수는 워치독(watchdog) 스레드를 사용하여 구현됩니다.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
버전 3.7에서 변경: 이 함수는 이제 항상 사용할 수 있습니다.
버전 3.15에서 변경: max_threads 키워드 인수를 추가했습니다.
- faulthandler.cancel_dump_traceback_later()¶
마지막
dump_traceback_later()호출을 취소합니다.
사용자 시그널에 트레이스백 덤프하기¶
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False, *, max_threads=100)¶
사용자 시그널을 등록합니다: signum 시그널에 대한 처리기를 설치하여, 모든 스레드, 또는 all_threads 가
False이면 현재 스레드의 트레이스백을 file 로 덤프합니다. chain이True이면 이전 처리기를 호출합니다. max_threads 는 덤프되는 스레드 수를 제한합니다.file은 시그널이
unregister()로 등록 해지 될 때까지 열려 있어야 합니다: 파일 기술자 관련 문제를 참조하십시오.윈도우에서는 사용할 수 없습니다.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
버전 3.15에서 변경: max_threads 키워드 인수를 추가했습니다.
- faulthandler.unregister(signum)¶
사용자 시그널을 등록 해지합니다:
register()로 설치된 signum 시그널 처리기를 제거합니다. 시그널이 등록되었으면True를 반환하고, 그렇지 않으면False를 반환합니다.윈도우에서는 사용할 수 없습니다.
파일 기술자 관련 문제¶
enable(), dump_traceback_later() 및 register()는 file 인자의 파일 기술자를 유지합니다. 파일이 닫히고 파일 기술자가 새 파일에 의해 다시 사용되거나, os.dup2()가 파일 기술자를 바꾸는 데 사용되면, 트레이스백이 다른 파일에 기록됩니다. 파일을 바꿀 때마다 이 함수들을 다시 호출하십시오.
예제¶
리눅스에서 결함 처리기를 활성화하거나 그렇지 않았을 때의 세그멘테이션 결함 예제:
$ 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 "/opt/python/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Current thread's C stack trace (most recent call first):
Binary file "/opt/python/python", at _Py_DumpStack+0x42 [0x5b27f7d7147e]
Binary file "/opt/python/python", at +0x32dcbd [0x5b27f7d85cbd]
Binary file "/opt/python/python", at +0x32df8a [0x5b27f7d85f8a]
Binary file "/usr/lib/libc.so.6", at +0x3def0 [0x77b73226bef0]
Binary file "/usr/lib/libc.so.6", at +0x17ef9c [0x77b7323acf9c]
Binary file "/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so", at +0xcdf6 [0x77b7315dddf6]
Binary file "/usr/lib/libffi.so.8", at +0x7976 [0x77b73158f976]
Binary file "/usr/lib/libffi.so.8", at +0x413c [0x77b73158c13c]
Binary file "/usr/lib/libffi.so.8", at ffi_call+0x12e [0x77b73158ef0e]
Binary file "/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so", at +0x15a33 [0x77b7315e6a33]
Binary file "/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so", at +0x164fa [0x77b7315e74fa]
Binary file "/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so", at +0xc624 [0x77b7315dd624]
Binary file "/opt/python/python", at _PyObject_MakeTpCall+0xce [0x5b27f7b73883]
Binary file "/opt/python/python", at +0x11bab6 [0x5b27f7b73ab6]
Binary file "/opt/python/python", at PyObject_Vectorcall+0x23 [0x5b27f7b73b04]
Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x490c [0x5b27f7cbb302]
Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
Binary file "/opt/python/python", at PyEval_EvalCode+0xc5 [0x5b27f7cd9ba3]
Binary file "/opt/python/python", at +0x255957 [0x5b27f7cad957]
Binary file "/opt/python/python", at +0x255ab4 [0x5b27f7cadab4]
Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x6c3e [0x5b27f7cbd634]
Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
Binary file "/opt/python/python", at +0x11b6e1 [0x5b27f7b736e1]
Binary file "/opt/python/python", at +0x11d348 [0x5b27f7b75348]
Binary file "/opt/python/python", at +0x11d626 [0x5b27f7b75626]
Binary file "/opt/python/python", at PyObject_Call+0x20 [0x5b27f7b7565e]
Binary file "/opt/python/python", at +0x32a67a [0x5b27f7d8267a]
Binary file "/opt/python/python", at +0x32a7f8 [0x5b27f7d827f8]
Binary file "/opt/python/python", at +0x32ac1b [0x5b27f7d82c1b]
Binary file "/opt/python/python", at Py_RunMain+0x31 [0x5b27f7d82ebe]
<truncated rest of calls>
Segmentation fault