faulthandler
--- 파이썬 트레이스백 덤프¶
버전 3.3에 추가.
이 모듈은 결함(fault) 시, 시간 초과 후 또는 사용자 시그널에 파이썬 트레이스백을 명시적으로 덤프하는 함수를 포함합니다. SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
및 SIGILL
시그널에 대한 결함 처리기를 설치하려면 faulthandler.enable()
를 호출하십시오. PYTHONFAULTHANDLER
환경 변수를 설정하거나 -X
faulthandler
명령 줄 옵션을 사용하여 시작할 때 활성화할 수도 있습니다.
결함 처리기는 Apport나 윈도우 결함 처리기(Windows fault handler)와 같은 시스템 결함 처리기와 호환됩니다. 이 모듈은 sigaltstack()
함수를 사용할 수 있으면 시그널 처리기에 대체 스택을 사용합니다. 이것은 스택 오버플로에서조차 트레이스백을 덤프할 수 있도록 합니다.
결함 처리기는 치명적일 때 호출되므로 시그널 안전한 함수만 사용할 수 있습니다 (예를 들어, 힙에 메모리를 할당할 수 없습니다). 이 제한 때문에 일반적인 파이썬 트레이스백에 비해 트레이스백 덤프는 최소화됩니다:
ASCII만 지원됩니다. 인코딩 시
backslashreplace
에러 처리기가 사용됩니다.각 문자열은 500자로 제한됩니다.
파일명, 함수 이름 및 줄 번호만 표시됩니다. (소스 코드 없음)
100프레임과 100스레드로 제한됩니다.
순서가 뒤집힙니다: 가장 최근의 호출이 먼저 표시됩니다.
기본적으로, 파이썬 트레이스백은 sys.stderr
에 기록됩니다. 트레이스백을 보려면, 응용 프로그램이 터미널에서 실행되어야 합니다. 로그 파일을 faulthandler.enable()
로 전달할 수도 있습니다.
모듈은 C로 구현되어 있으므로, 충돌 시나 파이썬이 교착 상태에 빠질 때 트레이스백을 덤프할 수 있습니다.
파이썬 개발 모드는 파이썬 시작 시 faulthandler.enable()
을 호출합니다.
트레이스백 덤프하기¶
-
faulthandler.
dump_traceback
(file=sys.stderr, all_threads=True)¶ 모든 스레드의 트레이스백을 file로 덤프합니다. all_threads가
False
면, 현재 스레드만 덤프합니다.버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
결함 처리기 상태¶
-
faulthandler.
enable
(file=sys.stderr, all_threads=True)¶ 결함 처리기를 활성화합니다:
SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
및SIGILL
시그널에 대한 처리기를 설치하여 파이썬 트레이스백을 덤프합니다. all_threads가True
면 실행 중인 모든 스레드에 대한 트레이스백을 생성합니다. 그렇지 않으면, 현재 스레드만 덤프합니다.file은 결함 처리기가 비활성화될 때까지 열려 있어야 합니다: 파일 기술자 관련 문제를 참조하십시오.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
버전 3.6에서 변경: 윈도우에서는, 윈도우 예외(Windows exception) 처리기도 설치됩니다.
-
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()
가 프로세스를 즉시 종료함에 유의하십시오. 파일 버퍼를 플러시 하는 것과 같은 정리 작업을 수행하지 않습니다.) 함수가 두 번 호출되면, 새 호출은 이전 매개 변수를 대체하고 시간제한을 다시 설정합니다. 타이머는 1초 미만의 해상도를 갖습니다.file은 트레이스백이 덤프 되거나
cancel_dump_traceback_later()
가 호출될 때까지 열려 있어야 합니다: 파일 기술자 관련 문제를 참조하십시오.이 함수는 워치독(watchdog) 스레드를 사용하여 구현됩니다.
버전 3.7에서 변경: 이 함수는 이제 항상 사용할 수 있습니다.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
-
faulthandler.
cancel_dump_traceback_later
()¶ 마지막
dump_traceback_later()
호출을 취소합니다.
사용자 시그널에 트레이스백 덤프하기¶
-
faulthandler.
register
(signum, file=sys.stderr, all_threads=True, chain=False)¶ 사용자 시그널을 등록합니다: signum 시그널에 대한 처리기를 설치해서, 모든 스레드, 또는 all_threads가
False
면 현재 스레드의, 트레이스백을 file로 덤프합니다. chain이True
면 이전 처리기를 호출합니다.file은 시그널이
unregister()
로 등록 해지 될 때까지 열려 있어야 합니다: 파일 기술자 관련 문제를 참조하십시오.윈도우에서는 사용할 수 없습니다.
버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.
-
faulthandler.
unregister
(signum)¶ 사용자 시그널을 등록 해지합니다:
register()
로 설치된 signum 시그널 처리기를 제거합니다. 시그널이 등록되었으면True
를 반환하고, 그렇지 않으면False
를 반환합니다.윈도우에서는 사용할 수 없습니다.
파일 기술자 관련 문제¶
enable()
, dump_traceback_later()
및 register()
는 file 인자의 파일 기술자를 유지합니다. 파일이 닫히고 파일 기술자가 새 파일에 의해 다시 사용되거나, os.dup2()
가 파일 기술자를 바꾸는 데 사용되면, 트레이스백이 다른 파일에 기록됩니다. 파일을 바꿀 때마다 이 함수들을 다시 호출하십시오.
예제¶
리눅스에서 결함 처리기를 활성화하거나 그렇지 않았을 때의 세그멘테이션 결함 예제:
$ 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