
    /hh}                     v   S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJrJrJrJrJr  S SKrS SKrS SKJr   S SKr\
R.                  (       d  \R0                  " S5      eSrSS jrS	 r\S
 5       r " S S\R:                  5      r\S:X  a  \R@                  " 5         gg! \ a    Sr Nmf = f)    )contextmanagerN)support)	os_helperscript_helper
is_android
MS_WINDOWSthreading_helper)dedentztest module requires subprocessg      ?c                 d    UnUSU -  -  nUSU-  -  nSU:  a  SUS-   US-
  -  -   U-   $ SU-   S-   $ )Nz#  File "<string>", line %s in func
z&  File "<string>", line %s in <module>   ^
$ )lineno1lineno2header	min_countregexs        ?/opt/python-3.13.8/usr/lib/python3.13/test/test_faulthandler.pyexpected_tracebackr      sZ    E	3g==E	5??E9}edly1}55==U{S      c                 D    [         R                  " [        S5      " U 5      $ )Nz(raising SIGSEGV on Android is unreliable)unittestskipIfr   )tests    r   skip_segfault_on_androidr   #   s#    ??:EGGKM Mr   c               #      #    [         R                  " 5       n  U v   [        R                  " U 5        g ! [        R                  " U 5        f = f7fN)tempfilemktempr   unlinkfilenames    r   temporary_filenamer%   (   s7      H#"	"s   A4 AAAc            	       p   \ rS rSrSTS jrSSSSSSSSS.S jrSUS	 jrS
 r\R                  " \
R                  R                  S5      S5      S 5       r\S 5       r\S 5       rS rS r\R                  " \
R                  S:H  S5      S 5       r\R                  " \SL S5      \R*                  " \" \S5      S5      \S 5       5       5       r\R                  " \SL S5      \R*                  " \" \S5      S5      \S 5       5       5       r\R                  " \SL S5      S 5       rS rS r\R                  " \
R                  R                  S5      S 5      \R                  " \" \S!5      (       + S"5      S# 5       5       r\S$ 5       r\S% 5       r \R                  " \
R                  S:H  S&5      \S' 5       5       r!\S( 5       r"\S) 5       r#\S* 5       r$S+ r%\&RN                  " 5       S, 5       r(\&RN                  " 5       S- 5       r)\&RN                  " 5       S. 5       r*SSS/.S0 jr+S1 r,S2 r-\R                  " \
R                  S:H  S&5      S3 5       r.S4 r/S5 r0S6 r1S7 r2SVSSS/.S8 jjr3S9 r4S: r5S; r6S< r7\R                  " \
R                  S:H  S&5      S= 5       r8\&Rr                  " S>5      S? 5       r:\R                  " \" \S@5      (       + SA5        SWSB j5       r;SC r<SD r=SE r>\R                  " \
R                  S:H  S&5      SF 5       r?SG r@SH rA\BSI 5       rCSJ rD\R*                  " \ESK5      SL 5       rF\R*                  " \ESK5      SM 5       rG\R*                  " \ESK5      SN 5       rH\R*                  " \ESK5      SO 5       rISP rJ\KR                  " 5       \R*                  " \&R                  SQ5      SR 5       5       rNSSrOg)XFaultHandlerTests0   Nc                    [        U5      R                  5       n/ nUb  UR                  U5        [        [        R
                  5      nSn[        R                  " XV5        [        R                  " 5          [        R                  " SUUUS9nU   UR                  5       u  pUR                  5       n
S S S 5        S S S 5        WR                  SS5      nU(       aJ  U R                  US5        [        US5       nUR!                  5       nS S S 5        UR                  SS5      nOqUbn  U R                  US5        [        R"                  " U[        R$                  S5        [        USS	S
9 nUR!                  5       nS S S 5        UR                  SS5      nUR'                  5       W
4$ ! , (       d  f       N= f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       Nf= f)Nzhandle_segv=0-c)pass_fdsenvasciibackslashreplace rbr   F)closefd)r
   stripappenddictosenvironr   set_sanitizer_env_varSuppressCrashReportr   spawn_pythoncommunicatewaitdecodeassertEqualopenreadlseekSEEK_SET
splitlines)selfcoder$   fdr+   r,   optionprocessoutputstderrexitcodefps               r   
get_outputFaultHandlerTests.get_output2   s    d|!!#>OOB2:: !%%c2((*#00t:B58:G !(!4!4!6"<<> 	 + w(:;VR(h% &]]7,>?F^VR(HHRa(b$." /]]7,>?F  "H,, 	 +* &% /.s<   6F:#F)3F::G,G)
F7	3F::
G	
G
G+TFz<module>)r$   all_threadsother_regexrE   know_current_threadpy_fatal_errorgarbage_collectingfunctionc                   U(       a  U(       a  SnOSnOSnSU 3/nU	(       a  UR                  S5        UR                  S5        UR                  U S35        U
(       a  UR                  S5        UR                  S	U S
U 35        SR                  U5      nU(       a	  SU SU S3nSU 3nU R                  XUS9u  pSR                  U5      nU R                  X5        U R	                  US5        g )NzCurrent thread 0x[0-9a-f]+zThread 0x[0-9a-f]+Stackr   z!Python runtime state: initializedr/   z \(most recent call first\):z  Garbage-collectingz  File "<string>", line z in r   z(?:|)z(?m)r$   rE   r   )r3   joinrL   assertRegexassertNotEqual)rC   rD   linenofatal_errorr$   rN   rO   rE   rP   rQ   rR   rS   r   r   rH   rJ   s                   r   check_errorFaultHandlerTests.check_error[   s     "5-F[M"#LL<=R <=>LL/00XJGH		% %+a0E ug??4r?J6"'Ha(r   c                 V    U(       a	  U< SU< 3nSU-  nU R                   " XU40 UD6  g )Nz: zFatal Python error: %sr^   )rC   rD   line_number
name_regexfunckwr]   s          r   check_fatal_error#FaultHandlerTests.check_fatal_error   s.    %):6J.;K>2>r   c                 6    SU-  nU R                   " XU40 UD6  g )NzWindows fatal exception: %sra   )rC   rD   rb   rc   re   r]   s         r   check_windows_exception)FaultHandlerTests.check_windows_exception   s!    3j@K>2>r   aixz5the first page of memory is a mapped read-only on AIXc                 h    [         (       d  U R                  SSS5        g U R                  SSS5        g )Nz
                import faulthandler
                faulthandler.enable()
                faulthandler._read_null()
                   z4(?:Segmentation fault|Bus error|Illegal instruction)access violation)r   rf   ri   rC   s    r   test_read_null FaultHandlerTests.test_read_null   sC     z"" $
 ,	- (( *
 "$r   c                 *    U R                  SSS5        g )Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv()
            rm   Segmentation faultrf   ro   s    r   test_sigsegvFaultHandlerTests.test_sigsegv         
  	"r   c                 *    U R                  SSSSSS9  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)rS   rR   rt   ro   s    r   test_gcFaultHandlerTests.test_gc   s*     	  8  #? 	 	%r   c           	      ,    U R                  SSSSSSS9  g )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler._fatal_error_c_thread()
            rm   zin new threadFfaulthandler_fatal_error_threadT)rP   rd   rQ   rt   ro   s    r   test_fatal_error_c_thread+FaultHandlerTests.test_fatal_error_c_thread   s+      
  %2 	 		!r   c                 *    U R                  SSS5        g )Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigabrt()
            rm   Abortedrt   ro   s    r   test_sigabrtFaultHandlerTests.test_sigabrt   s      
 	r   win32z"SIGFPE cannot be caught on Windowsc                 *    U R                  SSS5        g )Nzr
            import faulthandler
            faulthandler.enable()
            faulthandler._sigfpe()
            rm   zFloating-point exceptionrt   ro   s    r   test_sigfpeFaultHandlerTests.test_sigfpe   s     	  
 &	(r   zneed _testcapiSIGBUSzneed signal.SIGBUSc                 *    U R                  SSS5        g )Nz
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGBUS)
               z	Bus errorrt   ro   s    r   test_sigbusFaultHandlerTests.test_sigbus   s     	   	r   SIGILLzneed signal.SIGILLc                 *    U R                  SSS5        g )Nz
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGILL)
            r   zIllegal instructionrt   ro   s    r   test_sigillFaultHandlerTests.test_sigill   s     	   !	#r   c           	          [         R                  " 5          U R                  SU S3SSSSS9  S S S 5        g ! , (       d  f       g = f)NzP
                import _testcapi
                _testcapi.fatal_error(b'xyz', )
                   xyz_testcapi_fatal_error_implT)rd   rQ   )r   r8   rf   )rC   release_gils     r   check_fatal_error_func(FaultHandlerTests.check_fatal_error_func  sQ     ((*"" (//:m <$ 1# # % +**s	   7
Ac                 &    U R                  S5        g )NFr   ro   s    r   test_fatal_error"FaultHandlerTests.test_fatal_error  s    ##E*r   c                 &    U R                  S5        g )NTr   ro   s    r   test_fatal_error_without_gil.FaultHandlerTests.test_fatal_error_without_gil  s    ##D)r   openbsdzVIssue #12868: sigaltstack() doesn't work on OpenBSD if Python is compiled with pthread_stack_overflowz#need faulthandler._stack_overflow()c                 (    U R                  SSSSS9  g )Nzz
            import faulthandler
            faulthandler.enable()
            faulthandler._stack_overflow()
            rm   z (?:Segmentation fault|Bus error)z unable to raise a stack overflow)rO   rt   ro   s    r   test_stack_overflow%FaultHandlerTests.test_stack_overflow   s'     	  
 .: 	 	<r   c                 *    U R                  SSS5        g )Nzw
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv(True)
            rm   rs   rt   ro   s    r   test_gil_released#FaultHandlerTests.test_gil_released/  rw   r   c                     [        5        nU R                  SR                  [        U5      S9SSUS9  S S S 5        g ! , (       d  f       g = f)Nz
                import faulthandler
                output = open({filename}, 'wb')
                faulthandler.enable(output)
                faulthandler._sigsegv()
                r#      rs   )r%   rf   formatreprrC   r$   s     r   test_enable_file"FaultHandlerTests.test_enable_file9  sI    !X"" $
 FDNF3$! # # "!!s	   )=
Az.subprocess doesn't support pass_fds on Windowsc                     [         R                  " S5       nUR                  5       nU R                  SU-  SSUS9  S S S 5        g ! , (       d  f       g = f)Nwb+z
                import faulthandler
                import sys
                faulthandler.enable(%s)
                faulthandler._sigsegv()
                r   rs   rE   )r    TemporaryFilefilenorf   )rC   rK   rE   s      r   test_enable_fd FaultHandlerTests.test_enable_fdF  sX     ##E*bB"" $
 $ $ #  +**s   &A
Ac                 (    U R                  SSSSS9  g )Nz
            import faulthandler
            faulthandler.enable(all_threads=False)
            faulthandler._sigsegv()
            rm   rs   FrN   rt   ro   s    r   test_enable_single_thread+FaultHandlerTests.test_enable_single_threadV  s%      
   	 	r   c                     SnSnU R                  U5      u  p4SR                  U5      nU R                  X#;  U< SU< 35        U R                  US5        g )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            faulthandler._sigsegv()
            zFatal Python errorr   z is present in r   )rL   rY   
assertTruer[   )rC   rD   not_expectedrI   rJ   s        r   test_disableFaultHandlerTests.test_disablea  sY     ,??406"2.:FC	EHa(r   c                 v   SnU R                  U5      u  p#SR                  U5      n[        R                  " SU[        R                  5      nU(       d  U R                  SU< 35        [        UR                  S5      R                  5       R                  S5      5      nS H  nU R                  Xe5        M     g )Nz
            import faulthandler
            import sys
            # Don't filter stdlib module names
            sys.stdlib_module_names = frozenset()
            faulthandler.enable()
            faulthandler._sigsegv()
            r   z*^Extension modules:(.*) \(total: [0-9]+\)$z$Cannot find 'Extension modules:' in r   z, )sysfaulthandler)rL   rY   research	MULTILINEfailsetgroupr2   splitassertIn)rC   rD   rI   rJ   matchmodulesnames          r   test_dump_ext_modules'FaultHandlerTests.test_dump_ext_modulesp  s      ??406"		G ",,0II<VJGHekk!n**,22489+DMM$( ,r   c                 r   [         R                  n [         R                  [         l        [        R                  " 5       n [        R
                  " 5         U R                  [        R                  " 5       5        [        R                  " 5         U R                  [        R                  " 5       5        U(       a  [        R
                  " 5         O[        R                  " 5          U[         l        g ! U(       a  [        R
                  " 5         f [        R                  " 5         f = f! U[         l        f = fr   )	r   rI   
__stderr__r   
is_enabledenabler   disableassertFalse)rC   orig_stderrwas_enableds      r   test_is_enabled!FaultHandlerTests.test_is_enabled  s    jj	% CJ&113K	+##% 7 7 9:$$&  !8!8!:; '') ((*$CJ  '') ((*$CJs$   .D) A2C2 33D) 24D&&D) )D6c                     Sn[         R                  SSU4n[        R                  " U5      nU R	                  UR                  5       S5        g )N5import faulthandler; print(faulthandler.is_enabled())-Er*      False)r   
executable
subprocesscheck_outputr=   rstrip)rC   rD   argsrH   s       r   test_disabled_by_default*FaultHandlerTests.test_disabled_by_default  sB     GdD1((.(3r   c           	      R   Sn[        S [        R                  [        R                  R                  (       a  SOSSSSU45      n[
        R                  R                  5       nUR                  SS 5        [        R                  " X#S9nU R                  UR                  5       S	5        g )
Nr   r   r/   z-Xr   r*   PYTHONFAULTHANDLERr,      True)filterr   r   flagsignore_environmentr5   r6   copypopr   r   r=   r   rC   rD   r   r,   rH   s        r   test_sys_xoptions#FaultHandlerTests.test_sys_xoptions  s     GdS^^%(YY%A%ATr!>4? @ jjoo$d+((7'2r   c                    Sn[         R                  SU4n[        [        R                  5      nSUS'   SUS'   [
        R                  " X#S9nU R                  UR                  5       S5        [        [        R                  5      nSUS'   SUS'   [
        R                  " X#S9nU R                  UR                  5       S	5        g )
Nr   r*   r/   r   PYTHONDEVMODEr   r   1r   )	r   r   r4   r5   r6   r   r   r=   r   r   s        r   test_env_varFaultHandlerTests.test_env_var  s     Gd+2::$& !!O((7(3 2::$' !!O((7'2r   rX   c                    SnUR                  UUS9nU(       a  SnOUb  SnOSnSSU-  SS	/nU R                  X1U5      u  pgU R                  Xe5        U R                  US
5        g )Na[  
            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()
            rX   ry         Stack (most recent call first):z#  File "<string>", line %s in funcBz#  File "<string>", line 17 in funcAz&  File "<string>", line 19 in <module>r   r   rL   r=   )rC   r$   rE   rD   r\   expectedtracerJ   s           r   check_dump_traceback&FaultHandlerTests.check_dump_traceback  s    
* {{  
 F^FF-1F:14	
 //$"=)1%r   c                 $    U R                  5         g r   )r   ro   s    r   test_dump_traceback%FaultHandlerTests.test_dump_traceback  s    !!#r   c                 j    [        5        nU R                  US9  S S S 5        g ! , (       d  f       g = fNr#   )r%   r   r   s     r   test_dump_traceback_file*FaultHandlerTests.test_dump_traceback_file  s'    !X%%x%8 "!!   $
2c                     [         R                  " S5       nU R                  UR                  5       S9  S S S 5        g ! , (       d  f       g = fNr   r   )r    r   r   r   rC   rK   s     r   test_dump_traceback_fd(FaultHandlerTests.test_dump_traceback_fd  s7     ##E*b%%%5 +**	   >
Ac                     SnSUS-   -  nSU-  S-   nSnUR                  US9nSSU-  S	/nU R                  U5      u  pgU R                  Xe5        U R                  US
5        g )Ni  x2   z...z
            import faulthandler

            def {func_name}():
                faulthandler.dump_traceback(all_threads=False)

            {func_name}()
            )	func_namer   z  File "<string>", line 4 in %sz%  File "<string>", line 6 in <module>r   r   )rC   maxlenr  	truncatedrD   r   r   rJ   s           r   test_truncateFaultHandlerTests.test_truncate  s    6B;'	&L5(	 {{  
 .-	93

 //$/)1%r   c                 .   SnUR                  [        U5      S9nU R                  X!5      u  p4SR                  U5      nU(       a  SnOSnSn[	        UR                  US95      R                  5       nU R                  X65        U R                  US5        g )	Na  
            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 "<string>", 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 "<string>", line {lineno} in dump
              File "<string>", line 28 in <module>$
            )r\   r   )r   r   rL   rY   r
   r2   rZ   r=   )rC   r$   rD   rH   rJ   r\   r   s          r   check_dump_traceback_threads.FaultHandlerTests.check_dump_traceback_threads  s    
@ {{DN{3??4:6"FF
 u||6|2399;'1%r   c                 &    U R                  S 5        g r   )r  ro   s    r   test_dump_traceback_threads-FaultHandlerTests.test_dump_traceback_threadsS  s    ))$/r   c                 n    [        5        nU R                  U5        S S S 5        g ! , (       d  f       g = fr   )r%   r  r   s     r    test_dump_traceback_threads_file2FaultHandlerTests.test_dump_traceback_threads_fileV  s$    !X--h7 "!!s   &
4c          	      x   [        [        R                  " [        S95      nSnUR	                  [        UUUUUS9nU R                  Xt5      u  pSR                  U5      nU(       d0  Un
U(       a  U
S-  n
SU-  n[        SSXS	9nU R                  X5        OU R                  US
5        U R                  U	S5        g )N)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()
            )timeoutrepeatcancelloopsr$   rE   r   r   zATimeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n      )r   r/   r   )
strdatetime	timedeltaTIMEOUTr   rL   rY   r   rZ   r=   )rC   r#  r$  r%  r$   rE   timeout_strrD   r   rJ   countr   r   s                r   check_dump_traceback_later,FaultHandlerTests.check_dump_traceback_laterZ  s     (,,W=>< {{  
 //$9		% E
Y\ggF&r2vGEU*UB'1%r   c                 $    U R                  5         g r   r.  ro   s    r   test_dump_traceback_later+FaultHandlerTests.test_dump_traceback_later  s    '')r   c                 "    U R                  SS9  g )NT)r#  r1  ro   s    r    test_dump_traceback_later_repeat2FaultHandlerTests.test_dump_traceback_later_repeat      ''t'4r   c                 "    U R                  SS9  g )NT)r$  r1  ro   s    r    test_dump_traceback_later_cancel2FaultHandlerTests.test_dump_traceback_later_cancel  r7  r   c                 j    [        5        nU R                  US9  S S S 5        g ! , (       d  f       g = fr  )r%   r.  r   s     r   test_dump_traceback_later_file0FaultHandlerTests.test_dump_traceback_later_file  s'    !X++X+> "!!r  c                     [         R                  " S5       nU R                  UR                  5       S9  S S S 5        g ! , (       d  f       g = fr  )r    r   r.  r   r	  s     r   test_dump_traceback_later_fd.FaultHandlerTests.test_dump_traceback_later_fd  s7     ##E*b++ryy{+; +**r  walltimec                 "    U R                  SS9  g )Nr   )r%  r1  ro   s    r   test_dump_traceback_later_twice1FaultHandlerTests.test_dump_traceback_later_twice  s    ''a'0r   registerzneed faulthandler.registerc           	      x   [         R                  nSnUR                  UUUUUUS9nU R                  Xq5      u  pSR	                  U5      nU(       d+  U(       a  Sn
OSn
[        SSU
5      n
U R                  X5        OU R                  US5        U(       a  U R                  U	S	5        g U R                  U	S	5        g )
Naz  
            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)
            )rN   signum
unregisterchainr$   rE   r   z8Current thread 0x[0-9a-f]+ \(most recent call first\):\nz#Stack \(most recent call first\):\nr       r/   r   )	signalSIGUSR1r   rL   rY   r   rZ   r=   r[   )rC   r$   rN   rH  rI  rE   rG  rD   r   rJ   r   s              r   check_register FaultHandlerTests.check_register  s     -\ {{#!  
 //$9		% S>&r2u5EU*UB'!,Xq)r   c                 $    U R                  5         g r   rM  ro   s    r   test_registerFaultHandlerTests.test_register  s    r   c                 "    U R                  SS9  g )NT)rH  rP  ro   s    r   test_unregister!FaultHandlerTests.test_unregister  s    t,r   c                 j    [        5        nU R                  US9  S S S 5        g ! , (       d  f       g = fr  )r%   rM  r   s     r   test_register_file$FaultHandlerTests.test_register_file  s'    !X2 "!!r  c                     [         R                  " S5       nU R                  UR                  5       S9  S S S 5        g ! , (       d  f       g = fr  )r    r   rM  r   r	  s     r   test_register_fd"FaultHandlerTests.test_register_fd  s7     ##E*b299;/ +**r  c                 "    U R                  SS9  g )NTr   rP  ro   s    r   test_register_threads'FaultHandlerTests.test_register_threads  s    -r   c                 "    U R                  SS9  g )NT)rI  rP  ro   s    r   test_register_chain%FaultHandlerTests.test_register_chain  s    $'r   c              #   *  #    [         R                  n S [         l        U R                  [        5       nS v   S S S 5        U R	                  [        WR                  5      S5        U[         l        g ! , (       d  f       N?= f! U[         l        f = f7f)Nzsys.stderr is None)r   rI   assertRaisesRuntimeErrorr=   r(  	exception)rC   rI   cms      r   check_stderr_none#FaultHandlerTests.check_stderr_none  se     	 CJ""<0B 1S.0DECJ	 10  CJs2   B B A2-B &B2
B <B BBc                 H   U R                  5          [        R                  " 5         S S S 5        U R                  5          [        R                  " 5         S S S 5        U R                  5          [        R                  " S5        S S S 5        [        [        S5      (       a>  U R                  5          [        R                  " [        R                  5        S S S 5        g g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)NgMbP?rE  )	rg  r   r   dump_tracebackdump_traceback_laterhasattrrE  rK  rL  ro   s    r   test_stderr_None"FaultHandlerTests.test_stderr_None#  s     ##%! &##%'') &##%--d3 &<,,'')%%fnn5 *) - &%%%%% *)s.   C C1-D1%D 
C.1
C?
D
D!zspecific to Windowsc                 H    S H  u  pU R                  SU S3SU5        M     g )N))EXCEPTION_ACCESS_VIOLATIONrn   )EXCEPTION_INT_DIVIDE_BY_ZEROzint divide by zero)EXCEPTION_STACK_OVERFLOWzstack overflowz
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(faulthandler._r   rm   )ri   )rC   excr   s      r   test_raise_exception&FaultHandlerTests.test_raise_exception0  s@    
IC
 (( .= >AE B*
 
r   c                     S HJ  nSU S3n[        U5      nU R                  U5      u  p4U R                  U/ 5        U R                  XA5        ML     g )N)l   cs@ l   RC@ z
                    import faulthandler
                    faulthandler.enable()
                    faulthandler._raise_exception(z)
                    r
   rL   r=   )rC   exc_coderD   rH   rJ   s        r   test_ignore_exception'FaultHandlerTests.test_ignore_exception?  s`    
H3 4<* =D
 $<D#t4FVR(X0
r   c                     S HC  nU R                  SUS S35      u  p#U R                  U/ 5        U R                  UXS-  45        ME     g )N)r   ixV4i   @i  @i   piz{
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(0xr  r   i)rL   r=   r   )rC   rs  rH   rJ   s       r   test_raise_nonfatal_exception/FaultHandlerTests.test_raise_nonfatal_exceptionO  sf    
C  $ 41 25Q 80  F VR( MM(k 124#
r   c                     [        S5      nU R                  U5      u  p#U R                  U/ 5        U R                  US5        g )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            code = faulthandler._EXCEPTION_ACCESS_VIOLATION
            faulthandler._raise_exception(code)
        l       rw  rC   rD   rH   rJ   s       r    test_disable_windows_exc_handler2FaultHandlerTests.test_disable_windows_exc_handlerk  sD        ??40$:.r   c                     [        S5      nU R                  U5      u  p#U R                  U/ 5        U R                  US5        g )Nz`
            import faulthandler
            faulthandler.cancel_dump_traceback_later()
        r   rw  r  s       r   .test_cancel_later_without_dump_traceback_later@FaultHandlerTests.test_cancel_later_without_dump_traceback_laterx  sF         ??40$1%r   z&only meaningful if the GIL is disabledc                 d    [        S5      nU R                  U5      u  p#U R                  US5        g )NaL  
        import faulthandler
        from threading import Thread, Event

        class Waiter(Thread):
            def __init__(self):
                Thread.__init__(self)
                self.running = Event()
                self.stop = Event()

            def run(self):
                self.running.set()
                self.stop.wait()

        for _ in range(100):
            waiter = Waiter()
            waiter.start()
            waiter.running.wait()
            faulthandler.dump_traceback(all_threads=True)
            waiter.stop.set()
            waiter.join()
        r   rw  )rC   rD   _rJ   s       r   !test_free_threaded_dump_traceback3FaultHandlerTests.test_free_threaded_dump_traceback  s5       , ood+1%r   r   )NNr   )FFr   )FFFFN)P__name__
__module____qualname____firstlineno__rL   r^   rf   ri   r   r   r   platform
startswithrp   r   ru   r{   r   r   r   	_testcapi
skipUnlessrl  rK  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_subprocessr   r   r   r   r   r  r
  r  r  r  r  r.  r2  r5  r9  r<  r?  requires_resourcerC  rM  rQ  rT  rW  rZ  r]  r`  r   rg  rm  r   rt  ry  r|  r  r  r	   requires_working_threadingPy_GIL_DISABLEDr  __static_attributes__r   r   r   r'   r'   0   s   '-T "t#(','%)N?? __S\\,,U3LN$N$* " " !% !%F
! __S\\W,9;(;( __Y$&(8924HI	  J :	 __Y$&(8924HI	#  J :	# __Y$&(89
% :
%+* __S\\,,Y7BC __/@AA:<<<C
< " " 
# 
# __S\\W,EG G   ) ) ) )&%,   "4 #4   "
3 #
3   "3 #3$ 04 ,&\$9 __S\\W,EG6G6&0;&z08<&/3<&|*55? __S\\W,EG<G< z*1 +1 __z::139>9=O*3O*b-3 __S\\W,EG0G0.(    6 %:; < %:;1 <1 %:;4 <46 %:;
/ <
/	& 002002Z[& \ 3&r   r'   __main__)r   )!
contextlibr   r)  r   r5   r   rK  r   r   r   r   test.supportr   r   r   r   r	   r    r   textwrapr
   r  ImportErrorhas_subprocess_supportSkipTestr+  r   r   r%   TestCaser'   r  mainr   r   r   <module>r     s    %   	 	   
  [ [    %%


=
>>
!M
 # #n&)) n&` zMMO _  Is   B- -B87B8