ٌ -O\CvSSKJr SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK J r SSK J r J r JrJrJr SSKrSSKrSSKJr SSKr\ R.(d\R0"S5eSrSSjrS r\S 5r"S S \R:5r\S :Xa\R@"5 gg!\a SrNmf=f))contextmanagerN)support) os_helper script_helper is_android MS_WINDOWSthreading_helper)dedentztest module requires subprocessg?cdUnUSU-- nUSU-- nSU:aSUS-US- --U-$SU-S-$)Nz# File "", line %s in func z& File "", line %s in ^ $)lineno1lineno2header min_countregexs =/opt/alt/python313/lib64/python3.13/test/test_faulthandler.pyexpected_tracebackrsZ E 3g ==E 5 ??E9}edly1}55==U{S  cD[R"[S5"U5$)Nz(raising SIGSEGV on Android is unreliable)unittestskipIfr)tests rskip_segfault_on_androidr#s# ??:E GGK MMrc## [R"5nUv [R"U5 g![R"U5 f=f7fN)tempfilemktemprunlinkfilenames rtemporary_filenamer%(s7 H#" "sA4AA  Ac p\rSrSrSTSjrSSSSSSSSS.SjrSUS jrS r\R"\ RRS 5S 5S 5r \S5r\S5rSrSr\R"\ RS:HS5S5r\R"\SLS5\R*"\"\S5S5\S555r\R"\SLS5\R*"\"\S5S5\S555r\R"\SLS5S5rSrSr\R"\ RRS5S 5\R"\"\S!5(+S"5S#55r\S$5r\S%5r \R"\ RS:HS&5\S'55r!\S(5r"\S)5r#\S*5r$S+r%\&RN"5S,5r(\&RN"5S-5r)\&RN"5S.5r*SSS/.S0jr+S1r,S2r-\R"\ RS:HS&5S35r.S4r/S5r0S6r1S7r2SVSSS/.S8jjr3S9r4S:r5S;r6S<r7\R"\ RS:HS&5S=5r8\&Rr"S>5S?5r:\R"\"\S@5(+SA5SWSBj5r;SCr\R"\ RS:HS&5SF5r?SGr@SHrA\BSI5rCSJrD\R*"\ESK5SL5rF\R*"\ESK5SM5rG\R*"\ESK5SN5rH\R*"\ESK5SO5rISPrJ\KR"5\R*"\&RSQ5SR55rNSSrOg)XFaultHandlerTests0Nc[U5R5n/nUbURU5 [[R 5nSn[ R"XV5 [ R"5 [R"SUUUS9nU UR5upUR5n SSS5 SSS5 WRSS5nU(aJURUS5 [US5n U R!5nSSS5 URSS5nOqUbnURUS5 [R""U[R$S 5 [USS S 9n U R!5nSSS5 URSS5nUR'5W 4$!,(df  N=f!,(df  GN=f!,(df  N=f!,(df  Nf=f) aC Run the specified code in Python (in a new child process) and read the output from the standard error or from a file (if filename is set). Return the output lines as a list. Strip the reference count from the standard error for Python debug build, and replace "Current thread 0x00007f8d8fbd9700" by "Current thread XXX". Nz handle_segv=0-c)pass_fdsenvasciibackslashreplacerbrF)closefd)r stripappenddictosenvironrset_sanitizer_env_varSuppressCrashReportr spawn_python communicatewaitdecode assertEqualopenreadlseekSEEK_SET splitlines) selfcoder$fdr+r,optionprocessoutputstderrexitcodefps r get_outputFaultHandlerTests.get_output2sd|!!# > OOB 2::!%%c2  ( ( *#00t:B58:G!(!4!4!6"<<> +w(:;    VR (h%&]]7,>?F ^   VR ( HHRa (b$."/]]7,>?F  "H,, + *&% /.s<6F:#F)3F::G ,G) F7 3F:: G  G G+TFz)r$ all_threads other_regexrEknow_current_threadpy_fatal_errorgarbage_collectingfunctioncU(a U(aSn OSn OSn SU3/n U (aU RS5 U RS5 U RU S35 U (aU RS5 U RS US U 35 S RU 5n U(a S U S US3n SU 3n URXUS9upS RU5nURX5 UR US5 g)z Check that the fault handler for fatal errors is enabled and check the traceback from the child process output. Raise an error if the output doesn't match the expected format. zCurrent thread 0x[0-9a-f]+zThread 0x[0-9a-f]+Stackr z!Python runtime state: initializedr/z \(most recent call first\):z Garbage-collectingz File "", line z in rz(?:|)z(?m)r$rErN)r3joinrL assertRegexassertNotEqual)rCrDlineno fatal_errorr$rNrOrErPrQrRrSrrrHrJs r check_errorFaultHandlerTests.check_error[s "5-F[M"#  LL< = R  <=>  LL/ 0 0XJGH %  %+a0Eug??4r?J6" ' Ha(rc VU(a U<SU<3nSU-nUR"XU40UD6 g)Nz: zFatal Python error: %sr^)rCrD line_number name_regexfunckwr]s rcheck_fatal_error#FaultHandlerTests.check_fatal_errors. %):6J.;  K>2>rc 6SU-nUR"XU40UD6 g)NzWindows fatal exception: %sra)rCrDrbrcrer]s rcheck_windows_exception)FaultHandlerTests.check_windows_exceptions!3j@  K>2>raixz5the first page of memory is a mapped read-only on AIXch[(dURSSS5 gURSSS5 g)Nz import faulthandler faulthandler.enable() faulthandler._read_null() z4(?:Segmentation fault|Bus error|Illegal instruction)access violation)rrfrirCs rtest_read_null FaultHandlerTests.test_read_nullsCz  " "$ , -  ( (* "  $rc*URSSS5 g)Nzs import faulthandler faulthandler.enable() faulthandler._sigsegv() rmSegmentation faultrfros r test_sigsegvFaultHandlerTests.test_sigsegv     "rc*URSSSSSS9 g)Na import faulthandler import gc import sys faulthandler.enable() class RefCycle: def __del__(self): faulthandler._sigsegv() # create a reference cycle which triggers a fatal # error in a destructor a = RefCycle() b = RefCycle() a.b = b b.a = a # Delete the objects, not the cycle a = None b = None # Break the reference cycle: call __del__() gc.collect() # Should not reach this line print("exit", file=sys.stderr) rs__del__T)rSrRrtros rtest_gcFaultHandlerTests.test_gcs*  8  #?  %rc ,URSSSSSSS9 g)Nz import faulthandler faulthandler.enable() faulthandler._fatal_error_c_thread() rmz in new threadFfaulthandler_fatal_error_threadT)rPrdrQrtros rtest_fatal_error_c_thread+FaultHandlerTests.test_fatal_error_c_threads+     %2  !rc*URSSS5 g)Nzs import faulthandler faulthandler.enable() faulthandler._sigabrt() rmAbortedrtros r test_sigabrtFaultHandlerTests.test_sigabrts      rwin32z"SIGFPE cannot be caught on Windowsc*URSSS5 g)Nzr import faulthandler faulthandler.enable() faulthandler._sigfpe() rmzFloating-point exceptionrtros r test_sigfpeFaultHandlerTests.test_sigfpes    &  (rzneed _testcapiSIGBUSzneed signal.SIGBUSc*URSSS5 g)Nz import faulthandler import signal faulthandler.enable() signal.raise_signal(signal.SIGBUS) z Bus errorrtros r test_sigbusFaultHandlerTests.test_sigbuss     rSIGILLzneed signal.SIGILLc*URSSS5 g)Nz import faulthandler import signal faulthandler.enable() signal.raise_signal(signal.SIGILL) rzIllegal instructionrtros r test_sigillFaultHandlerTests.test_sigills    ! #rc [R"5 URSUS3SSSSS9 SSS5 g!,(df  g=f)NzP import _testcapi _testcapi.fatal_error(b'xyz', ) xyz_testcapi_fatal_error_implT)rdrQ)rr8rf)rC release_gils rcheck_fatal_error_func(FaultHandlerTests.check_fatal_error_func sQ ( ( *  " "(//:m<$1# # %+ * *s 7 Ac&URS5 g)NFrros rtest_fatal_error"FaultHandlerTests.test_fatal_errors ##E*rc&URS5 g)NTrros rtest_fatal_error_without_gil.FaultHandlerTests.test_fatal_error_without_gils ##D)ropenbsdzVIssue #12868: sigaltstack() doesn't work on OpenBSD if Python is compiled with pthread_stack_overflowz#need faulthandler._stack_overflow()c(URSSSSS9 g)Nzz import faulthandler faulthandler.enable() faulthandler._stack_overflow() rmz (?:Segmentation fault|Bus error)z unable to raise a stack overflow)rOrtros rtest_stack_overflow%FaultHandlerTests.test_stack_overflow s'    .:  4?@jjoo $d+((7 '2rcSn[RSU4n[[R5nSUS'SUS'[ R "X#S9nURUR5S5 [[R5nSUS'SUS'[ R "X#S9nURUR5S 5 g) Nrr*r/r PYTHONDEVMODErr1r) rrr4r5r6rrr=rrs r test_env_varFaultHandlerTests.test_env_varsGd+2::$& !!O((7 (32::$' !!O((7 '2rrXcSnURUUS9nU(aSnOUbSnOSnSSU-S S /nURX1U5upgURXe5 URUS 5 g) z Explicitly call dump_traceback() function and check its output. Raise an error if the output doesn't match the expected format. a[ import faulthandler filename = {filename!r} fd = {fd} def funcB(): if filename: with open(filename, "wb") as fp: faulthandler.dump_traceback(fp, all_threads=False) elif fd is not None: faulthandler.dump_traceback(fd, all_threads=False) else: faulthandler.dump_traceback(all_threads=False) def funcA(): funcB() funcA() rXryN Stack (most recent call first):z# File "", line %s in funcBz# File "", line 17 in funcAz& File "", line 19 in rrrLr=)rCr$rErDr\expectedtracerJs rcheck_dump_traceback&FaultHandlerTests.check_dump_tracebacks *{{  F ^FF - 1F : 1 4   //$"= ) 1%rc$UR5 gr)rros rtest_dump_traceback%FaultHandlerTests.test_dump_tracebacks !!#rcj[5nURUS9 SSS5 g!,(df  g=fNr#)r%rrs rtest_dump_traceback_file*FaultHandlerTests.test_dump_traceback_files'  !X  % %x % 8" ! !$ 2c[R"S5nURUR5S9 SSS5 g!,(df  g=fNrr)r rrrrCrKs rtest_dump_traceback_fd(FaultHandlerTests.test_dump_traceback_fds7 # #E *b  % % % 5+ * * > A cSnSUS--nSU-S-nSnURUS9nSSU-S /nURU5upgURXe5 URUS 5 g) Nix2z...z import faulthandler def {func_name}(): faulthandler.dump_traceback(all_threads=False) {func_name}() ) func_namerz File "", line 4 in %sz% File "", line 6 in rr)rCmaxlenr truncatedrDrrrJs r test_truncateFaultHandlerTests.test_truncates6B;' &L5( {{  . - 9 3  //$/ ) 1%rc.SnUR[U5S9nURX!5up4SRU5nU(aSnOSnSn[ URUS95R 5nUR X65 URUS5 g ) z Call explicitly dump_traceback(all_threads=True) and check the output. Raise an error if the output doesn't match the expected format. a import faulthandler from threading import Thread, Event import time def dump(): if {filename}: with open({filename}, "wb") as fp: faulthandler.dump_traceback(fp, all_threads=True) else: faulthandler.dump_traceback(all_threads=True) class Waiter(Thread): # avoid blocking if the main thread raises an exception. daemon = True def __init__(self): Thread.__init__(self) self.running = Event() self.stop = Event() def run(self): self.running.set() self.stop.wait() waiter = Waiter() waiter.start() waiter.running.wait() dump() waiter.stop.set() waiter.join() r#r a ^Thread 0x[0-9a-f]+ \(most recent call first\): (?: File ".*threading.py", line [0-9]+ in [_a-z]+ ){{1,3}} File "", line (?:22|23) in run File ".*threading.py", line [0-9]+ in _bootstrap_inner File ".*threading.py", line [0-9]+ in _bootstrap Current thread 0x[0-9a-f]+ \(most recent call first\): File "", line {lineno} in dump File "", line 28 in $ )r\rN)rrrLrYr r2rZr=)rCr$rDrHrJr\rs rcheck_dump_traceback_threads.FaultHandlerTests.check_dump_traceback_threadss @{{DN{3??4:6" FF u||6|2399; ' 1%rc&URS5 gr)rros rtest_dump_traceback_threads-FaultHandlerTests.test_dump_traceback_threadsSs ))$/rcn[5nURU5 SSS5 g!,(df  g=fr)r%rrs r test_dump_traceback_threads_file2FaultHandlerTests.test_dump_traceback_threads_fileVs$  !X  - -h 7" ! !s& 4c x[[R"[S95nSnUR [UUUUUS9nUR Xt5upSR U5nU(d0Un U(aU S-n SU-n [SSXS 9n URX5 OURUS 5 URU S 5 g ) z Check how many times the traceback is written in timeout x 2.5 seconds, or timeout x 3.5 seconds if cancel is True: 1, 2 or 3 times depending on repeat and cancel options. Raise an error if the output doesn't match the expect format. )secondsa import faulthandler import time import sys timeout = {timeout} repeat = {repeat} cancel = {cancel} loops = {loops} filename = {filename!r} fd = {fd} def func(timeout, repeat, cancel, file, loops): for loop in range(loops): faulthandler.dump_traceback_later(timeout, repeat=repeat, file=file) if cancel: faulthandler.cancel_dump_traceback_later() time.sleep(timeout * 5) faulthandler.cancel_dump_traceback_later() if filename: file = open(filename, "wb") elif fd is not None: file = sys.stderr.fileno() else: file = None func(timeout, repeat, cancel, file, loops) if filename: file.close() )timeoutrepeatcancelloopsr$rErrzATimeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n)rr/rN) strdatetime timedeltaTIMEOUTrrLrYrrZr=) rCr#r$r%r$rE timeout_strrDrrJcountrrs rcheck_dump_traceback_later,FaultHandlerTests.check_dump_traceback_laterZs(,,W=> <{{  //$9 % E Y\ggF&r2vGE   U *   UB ' 1%rc$UR5 grr.ros rtest_dump_traceback_later+FaultHandlerTests.test_dump_traceback_laters '')rc"URSS9 g)NT)r#r1ros r test_dump_traceback_later_repeat2FaultHandlerTests.test_dump_traceback_later_repeat ''t'4rc"URSS9 g)NT)r$r1ros r test_dump_traceback_later_cancel2FaultHandlerTests.test_dump_traceback_later_cancelr7rcj[5nURUS9 SSS5 g!,(df  g=fr)r%r.rs rtest_dump_traceback_later_file0FaultHandlerTests.test_dump_traceback_later_files'  !X  + +X + >" ! !rc[R"S5nURUR5S9 SSS5 g!,(df  g=fr)r rr.rr s rtest_dump_traceback_later_fd.FaultHandlerTests.test_dump_traceback_later_fds7 # #E *b  + +ryy{ + ;+ * *r walltimec"URSS9 g)Nr)r%r1ros rtest_dump_traceback_later_twice1FaultHandlerTests.test_dump_traceback_later_twices ''a'0rregisterzneed faulthandler.registerc x[RnSnURUUUUUUS9nURXq5upSR U5nU(d+U(aSn OSn [ SSU 5n UR X5 OURUS5 U(aURU S 5 g URU S 5 g ) z Register a handler displaying the traceback on a user signal. Raise the signal and check the written traceback. If chain is True, check that the previous signal handler is called. Raise an error if the output doesn't match the expected format. az import faulthandler import os import signal import sys all_threads = {all_threads} signum = {signum:d} unregister = {unregister} chain = {chain} filename = {filename!r} fd = {fd} def func(signum): os.kill(os.getpid(), signum) def handler(signum, frame): handler.called = True handler.called = False if filename: file = open(filename, "wb") elif fd is not None: file = sys.stderr.fileno() else: file = None if chain: signal.signal(signum, handler) faulthandler.register(signum, file=file, all_threads=all_threads, chain={chain}) if unregister: faulthandler.unregister(signum) func(signum) if chain and not handler.called: if file is not None: output = file else: output = sys.stderr print("Error: signal handler not called!", file=output) exitcode = 1 else: exitcode = 0 if filename: file.close() sys.exit(exitcode) )rNsignum unregisterchainr$rErz8Current thread 0x[0-9a-f]+ \(most recent call first\):\nz#Stack \(most recent call first\):\nr r/rN) signalSIGUSR1rrLrYrrZr=r[) rCr$rNrHrIrErGrDrrJrs rcheck_register FaultHandlerTests.check_registers-\{{#!  //$9 % S>&r2u5E   U *   UB '    ! ,   Xq )rc$UR5 grrMros r test_registerFaultHandlerTests.test_registers rc"URSS9 g)NT)rHrPros rtest_unregister!FaultHandlerTests.test_unregisters t,rcj[5nURUS9 SSS5 g!,(df  g=fr)r%rMrs rtest_register_file$FaultHandlerTests.test_register_files'  !X     2" ! !rc[R"S5nURUR5S9 SSS5 g!,(df  g=fr)r rrMrr s rtest_register_fd"FaultHandlerTests.test_register_fd s7 # #E *b   299;  /+ * *r c"URSS9 g)NTrrPros rtest_register_threads'FaultHandlerTests.test_register_threadss -rc"URSS9 g)NT)rIrPros rtest_register_chain%FaultHandlerTests.test_register_chains $'rc#*# [RnS[lUR[5nSv SSS5 UR [ WR 5S5 U[lg!,(df  N?=f!U[lf=f7f)Nzsys.stderr is None)rrI assertRaises RuntimeErrorr=r( exception)rCrIcms rcheck_stderr_none#FaultHandlerTests.check_stderr_nonese CJ""<0B1   S.0D ECJ 10 CJs2B BA2-B& B2 B<B BBcHUR5 [R"5 SSS5 UR5 [R"5 SSS5 UR5 [R"S5 SSS5 [ [S5(a>UR5 [R "[R5 SSS5 gg!,(df  N=f!,(df  N=f!,(df  N=f!,(df  g=f)NgMbP?rE) rgrrdump_tracebackdump_traceback_laterhasattrrErKrLros rtest_stderr_None"FaultHandlerTests.test_stderr_None#s # # %    !&  # # %  ' ' )&  # # %  - -d 3& < , ,'')%%fnn5*) - & % % % % %*)s.C C1-D1%D C.1 C? D D!zspecific to WindowscHSHupURSUS3SU5 M g)N))EXCEPTION_ACCESS_VIOLATIONrn)EXCEPTION_INT_DIVIDE_BY_ZEROzint divide by zero)EXCEPTION_STACK_OVERFLOWzstack overflowz import faulthandler faulthandler.enable() faulthandler._raise_exception(faulthandler._rrm)ri)rCexcrs rtest_raise_exception&FaultHandlerTests.test_raise_exception0s@ IC  ( (.=>AEB*     rcSHJnSUS3n[U5nURU5up4URU/5 URXA5 ML g)N)lcs@lRC@z import faulthandler faulthandler.enable() faulthandler._raise_exception(z) r rLr=)rCexc_coderDrHrJs rtest_ignore_exception'FaultHandlerTests.test_ignore_exception?s` H34<*=D $9=O*3O*b-3__S\\W,EG0G0.(   6%:; < %:; 1< 1%:;4<46%:; /< / &002 002Z[&\3&rr'__main__)r )! contextlibrr)rr5rrKrrrr test.supportrrrrr r rtextwrapr r ImportErrorhas_subprocess_supportSkipTestr+rrr%TestCaser'rmainrrrrs%  [[%%   = >> !M ##n &))n &` z MMO_IsB--B87B8