
    ;e?y                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlZd dlZd dlmZ 	 d dlZn# e$ r dZY nw xY we
j        s ej        d          d	Zej        d
k    ZddZd Zed             Z G d dej                  Ze dk    r ej!                     dS dS )    )contextmanagerN)support)	os_helper)script_helper
is_android)skip_if_sanitizer)dedentztest module requires subprocessg      ?nt   c                 d    |}|d| z  z  }|d|z  z  }d|k     rd|dz   |dz
  z  z   |z   S d|z   dz   S )Nz#  File "<string>", line %s in func
z&  File "<string>", line %s in <module>r   ^
$ )lineno1lineno2header	min_countregexs        -/usr/lib/python3.11/test/test_faulthandler.pyexpected_tracebackr      s\    E	3g==E	5??E9}}edly1}55==U{S      c                 H     t          j        t          d          |           S )Nz(raising SIGSEGV on Android is unreliable)unittestskipIfr   )tests    r   skip_segfault_on_androidr   &   s2    G8?:EG GGKM M Mr   c               #      K   t          j                    } 	 | V  t          j        |            d S # t          j        |            w xY wN)tempfilemktempr   unlinkfilenames    r   temporary_filenamer%   +   sO        H#"""""	""""s	   1 Ac            	       *   e Zd ZdRdZddddddddddZdSdZd	 Z ej        e	j
                            d
          d          d             Zed             Zed             Zd Zd Z ej        e	j
        dk    d          d             Z ej        edu d           ej         eed          d          ed                                     Z ej        edu d           ej         eed          d          ed                                     Zd Zd Zd Z ej        e	j
                            d          d           ej         eed            d!          d"                         Zed#             Z eddd$%          ed&                         Z  ej        e	j
        dk    d'           eddd$%          ed(                                     Z!ed)             Z"ed*             Z#ed+             Z$d, Z% e&j'                    d-             Z( e&j'                    d.             Z) e&j'                    d/             Z*ddd0d1Z+d2 Z,d3 Z- ej        e	j
        dk    d'          d4             Z.d5 Z/d6 Z0d7 Z1d8 Z2dTddd0d:Z3d; Z4d< Z5d= Z6d> Z7 ej        e	j
        dk    d'          d?             Z8d@ Z9 ej         eedA           dB          	 	 dUdC            Z:dD Z;dE Z<dF Z= ej        e	j
        dk    d'          dG             Z>dH Z?dI Z@eAdJ             ZBdK ZC ej        eDdL          dM             ZE ej        eDdL          dN             ZF ej        eDdL          dO             ZG ej        eDdL          dP             ZHdQ ZIdS )VFaultHandlerTestsNc                    	 t          |                                          }g }||                    |           t          j                    5  t          j        d||          }|5  |                                \  }}|                                }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |	                    dd          }|ri| 
                    |d           t          |d          5 }	|	                                }d d d            n# 1 swxY w Y   |	                    dd          }n|| 
                    |d           t          j        |t          j        d           t          |dd	          5 }	|	                                }d d d            n# 1 swxY w Y   |	                    dd          }|                                |fS )
N-c)pass_fdsasciibackslashreplace rbr   F)closefd)r	   stripappendr   SuppressCrashReportr   spawn_pythoncommunicatewaitdecodeassertEqualopenreadoslseekSEEK_SET
splitlines)
selfcoder$   fdr*   processoutputstderrexitcodefps
             r   
get_outputzFaultHandlerTests.get_output5   s   	 d||!!##>OOB(** 	* 	*#0thOOOG * *!(!4!4!6!6"<<>>* * * * * * * * * * * * * * *	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*
 w(:;; 
	@VR(((h%% ## # # # # # # # # # # # # # #]]7,>??FF^VR(((HRa(((b$... #"# # # # # # # # # # # # # # #]]7,>??F  ""H,,sZ   B8),B!B8!B%	%B8(B%	)B88B<?B<D""D&)D&F//F36F3TFz<module>)r$   all_threadsother_regexr@   know_current_threadpy_fatal_errorgarbage_collectingfunctionc                   	 |r|rd}nd}nd}d| g}|	r|                     d           |                     d           |                     | d           |
r|                     d           |                     d	| d
|            d                    |          }|r	d| d| d}d| }|                     |||          \  }}d                    |          }|                     ||           |                     |d           d S )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$   r@   r   )r1   joinrF   assertRegexassertNotEqual)r>   r?   linenofatal_errorr$   rG   rH   r@   rI   rJ   rK   rL   r   r   rB   rD   s                   r   check_errorzFaultHandlerTests.check_errorV   s_   	  	" .5-F"[""# 	>LL<===R===>>> 	1LL/000GGGXGGHHH		%   	10%00+000E u??4(r?JJ6""'''Ha(((((r   c                 B    |r|d|}d|z  } | j         |||fi | d S )Nz: zFatal Python error: %srW   )r>   r?   line_number
name_regexfunckwrV   s          r   check_fatal_errorz#FaultHandlerTests.check_fatal_error}   sI     	7%)TT::6J.;{K>>2>>>>>r   c                 0    d|z  } | j         |||fi | d S )NzWindows fatal exception: %srY   )r>   r?   rZ   r[   r]   rV   s         r   check_windows_exceptionz)FaultHandlerTests.check_windows_exception   s1    3j@{K>>2>>>>>r   aixz5the first page of memory is a mapped read-only on AIXc                 t    t           s|                     ddd           d S |                     ddd           d S )Nz
                import faulthandler
                faulthandler.enable()
                faulthandler._read_null()
                   z4(?:Segmentation fault|Bus error|Illegal instruction)access violation)
MS_WINDOWSr^   r`   r>   s    r   test_read_nullz FaultHandlerTests.test_read_null   sn      	$"" $
 ,	- 	- 	- 	- 	- (( *
 "$ $ $ $ $r   c                 4    |                      ddd           d S )Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv()
            rc   Segmentation faultr^   rf   s    r   test_sigsegvzFaultHandlerTests.test_sigsegv   1      
  	" 	" 	" 	" 	"r   c                 :    |                      ddddd           d S )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)
            	   ri   __del__T)rL   rK   rj   rf   s    r   test_gczFaultHandlerTests.test_gc   s>     	  8  #? 	 	% 	% 	% 	% 	%r   c                 <    |                      dddddd           d S )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler._fatal_error_c_thread()
            rc   zin new threadFfaulthandler_fatal_error_threadT)rI   r\   rJ   rj   rf   s    r   test_fatal_error_c_threadz+FaultHandlerTests.test_fatal_error_c_thread   s?      
  %2 	 		! 		! 		! 		! 		!r   c                 4    |                      ddd           d S )Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigabrt()
            rc   Abortedrj   rf   s    r   test_sigabrtzFaultHandlerTests.test_sigabrt   s1      
 	 	 	 	 	r   win32z"SIGFPE cannot be caught on Windowsc                 4    |                      ddd           d S )Nzr
            import faulthandler
            faulthandler.enable()
            faulthandler._sigfpe()
            rc   zFloating point exceptionrj   rf   s    r   test_sigfpezFaultHandlerTests.test_sigfpe   s3     	  
 &	( 	( 	( 	( 	(r   zneed _testcapiSIGBUSzneed signal.SIGBUSc                 4    |                      ddd           d S )Nz
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGBUS)
               z	Bus errorrj   rf   s    r   test_sigbuszFaultHandlerTests.test_sigbus   s3     	   	 	 	 	 	r   SIGILLzneed signal.SIGILLc                 4    |                      ddd           d S )Nz
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGILL)
            r|   zIllegal instructionrj   rf   s    r   test_sigillzFaultHandlerTests.test_sigill   s3     	   !	# 	# 	# 	# 	#r   c                     t          j                    5  |                     d| ddddd           d d d            d S # 1 swxY w Y   d S )NzP
                import _testcapi
                _testcapi.fatal_error(b'xyz', )
                   xyztest_fatal_errorT)r\   rJ   )r   r2   r^   )r>   release_gils     r   check_fatal_error_funcz(FaultHandlerTests.check_fatal_error_func  s    (** 	% 	%"" $/:$ $ $ '# # % % %	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   A  AAc                 0    |                      d           d S )NFr   rf   s    r   r   z"FaultHandlerTests.test_fatal_error  s    ##E*****r   c                 0    |                      d           d S )NTr   rf   s    r   test_fatal_error_without_gilz.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                 8    |                      dddd           d S )Nzz
            import faulthandler
            faulthandler.enable()
            faulthandler._stack_overflow()
            rc   z (?:Segmentation fault|Bus error)z unable to raise a stack overflow)rH   rj   rf   s    r   test_stack_overflowz%FaultHandlerTests.test_stack_overflow  s;     	  
 .: 	 	< 	< 	< 	< 	<r   c                 4    |                      ddd           d S )Nzw
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv(True)
            rc   ri   rj   rf   s    r   test_gil_releasedz#FaultHandlerTests.test_gil_released)  rl   r   z0sanitizer builds change crashing process output.)memoryubreasonc                     t                      5 }|                     d                    t          |                    dd|           d d d            d S # 1 swxY w Y   d S )Nz
                import faulthandler
                output = open({filename}, 'wb')
                faulthandler.enable(output)
                faulthandler._sigsegv()
                r#      ri   )r%   r^   formatreprr>   r$   s     r   test_enable_filez"FaultHandlerTests.test_enable_file3  s      !! 		#X"" $
 FDNNF33$! # # # #		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		# 		#s   ;AAAz.subprocess doesn't support pass_fds on Windowsc                     t          j        d          5 }|                                }|                     d|z  dd|           d d d            d S # 1 swxY w Y   d S )Nwb+z
                import faulthandler
                import sys
                faulthandler.enable(%s)
                faulthandler._sigsegv()
                r   ri   r@   )r    TemporaryFilefilenor^   )r>   rE   r@   s      r   test_enable_fdz FaultHandlerTests.test_enable_fdB  s     #E** 
	bB"" $
 $ $ #   
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	s   1AAAc                 8    |                      dddd           d S )Nz
            import faulthandler
            faulthandler.enable(all_threads=False)
            faulthandler._sigsegv()
            rc   ri   FrG   rj   rf   s    r   test_enable_single_threadz+FaultHandlerTests.test_enable_single_threadT  s9      
   	 	 	 	 	 	r   c                     d}d}|                      |          \  }}d                    |          }|                     ||v|d|           |                     |d           d S )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            faulthandler._sigsegv()
            zFatal Python errorr   z is present in r   )rF   rR   
assertTruerT   )r>   r?   not_expectedrC   rD   s        r   test_disablezFaultHandlerTests.test_disable_  s     ,??4006""F2.:llFFC	E 	E 	EHa(((((r   c                    d}|                      |          \  }}d                    |          }t          j        d|t          j                  }|s|                     d|           t          |                    d                                          	                    d                    }dD ]}| 
                    ||           d S )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)rF   rR   research	MULTILINEfailsetgroupr0   splitassertIn)r>   r?   rC   rD   matchmodulesnames          r   test_dump_ext_modulesz'FaultHandlerTests.test_dump_ext_modulesn  s      ??4006""	G ",0 0 	IIIGVGGHHHekk!nn**,,2248899+ 	) 	)DMM$((((	) 	)r   c                 B   t           j        }	 t           j        t           _        t          j                    }	 t          j                     |                     t          j                               t          j                     |                     t          j                               |rt          j                     nBt          j                     n.# |rt          j                     w t          j                     w xY w|t           _        d S # |t           _        w xY wr   )	r   rC   
__stderr__r   
is_enabledenabler   disableassertFalse)r>   orig_stderrwas_enableds      r   test_is_enabledz!FaultHandlerTests.test_is_enabled  s    j	% CJ&133K	+#%%% 7 9 9:::$&&&  !8!:!:;;; + ')))) (****  + ')))) (****$CJJJCJ$$$$s#   )D A2C **D +C??D Dc                     d}t           j        dd|f}t          j        |          }|                     |                                d           d S )N5import faulthandler; print(faulthandler.is_enabled())-Er)      False)r   
executable
subprocesscheck_outputr7   rstrip)r>   r?   argsrB   s       r   test_disabled_by_defaultz*FaultHandlerTests.test_disabled_by_default  sN     GdD1(..(33333r   c           	      T   d}t          d t          j        t          j        j        rdndddd|f          }t
          j                                        }|                    dd            t          j
        ||          }|                     |                                d	           d S )
Nr   r   r-   z-Xr   r)   PYTHONFAULTHANDLERenv   True)filterr   r   flagsignore_environmentr:   environcopypopr   r   r7   r   r>   r?   r   r   rB   s        r   test_sys_xoptionsz#FaultHandlerTests.test_sys_xoptions  s     GdS^%(Y%AITTr!>4? @ @ joo$d+++(3777'22222r   c                    d}t           j        d|f}t          t          j                  }d|d<   d|d<   t          j        ||          }|                     |                                d           t          t          j                  }d|d<   d|d<   t          j        ||          }|                     |                                d	           d S )
Nr   r)   r-   r   PYTHONDEVMODEr   r   1r   )	r   r   dictr:   r   r   r   r7   r   r   s        r   test_env_varzFaultHandlerTests.test_env_var  s     Gd+2:$& !!O(3777(333 2:$' !!O(3777'22222r   rQ   c                    	 d}|                     ||          }|rd}n|d}nd}dd|z  dd	g}|                     |||          \  }}|                     ||           |                     |d
           d S )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()
            rQ   rn         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   rF   r7   )r>   r$   r@   r?   rU   expectedtracerD   s           r   check_dump_tracebackz&FaultHandlerTests.check_dump_traceback  s    	* {{  
 
  	FF^FFF-1F:14	
 //$"==x)))1%%%%%r   c                 .    |                                   d S r   )r   rf   s    r   test_dump_tracebackz%FaultHandlerTests.test_dump_traceback  s    !!#####r   c                     t                      5 }|                     |           d d d            d S # 1 swxY w Y   d S Nr#   )r%   r   r   s     r   test_dump_traceback_filez*FaultHandlerTests.test_dump_traceback_file  s    !! 	9X%%x%888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9   377c                     t          j        d          5 }|                     |                                           d d d            d S # 1 swxY w Y   d S Nr   r   )r    r   r   r   r>   rE   s     r   test_dump_traceback_fdz(FaultHandlerTests.test_dump_traceback_fd  s     #E** 	6b%%%555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6   )AAAc                     d}d|dz   z  }d|z  dz   }d}|                     |          }dd|z  d	g}|                     |          \  }}|                     ||           |                     |d
           d S )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   )r>   maxlenr   	truncatedr?   r   r   rD   s           r   test_truncatezFaultHandlerTests.test_truncate  s    6B;'	&L5(	 {{  
 
 .-	93

 //$//x)))1%%%%%r   c                    	 d}|                     t          |                    }|                     ||          \  }}d                    |          }|rd}nd}d}t	          |                     |                                                    }|                     ||           |                     |d           d S )	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 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>$
            )rU   r   )r   r   rF   rR   r	   r0   rS   r7   )r>   r$   r?   rB   rD   rU   r   s          r   check_dump_traceback_threadsz.FaultHandlerTests.check_dump_traceback_threads  s    	@ {{DNN{33??4::6"" 	FFF
 u||6|223399;;'''1%%%%%r   c                 0    |                      d            d S r   )r   rf   s    r   test_dump_traceback_threadsz-FaultHandlerTests.test_dump_traceback_threadsO  s    ))$/////r   c                 ~    t                      5 }|                     |           d d d            d S # 1 swxY w Y   d S r   )r%   r   r   s     r    test_dump_traceback_threads_filez2FaultHandlerTests.test_dump_traceback_threads_fileR  s    !! 	8X--h777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   266r   c                   	 t          t          j        t                              }d}|                    t          |||||          }|                     ||          \  }}	d                    |          }|s8|}
|r|
dz  }
d|z  }t          dd||
	          }|                     ||           n| 	                    |d
           | 	                    |	d           d S )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$   r@   r   r   zATimeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n      )r   r-   r   )
strdatetime	timedeltaTIMEOUTr   rF   rR   r   rS   r7   )r>   r  r  r  r$   r@   timeout_strr?   r   rD   countr   r   s                r   check_dump_traceback_laterz,FaultHandlerTests.check_dump_traceback_laterV  s   	 (,W===>>< {{  
 
 //$99x		%   	(E 
Y\ggF&r2vGGGEUE****UB'''1%%%%%r   c                 .    |                                   d S r   r  rf   s    r   test_dump_traceback_laterz+FaultHandlerTests.test_dump_traceback_later  s    '')))))r   c                 2    |                      d           d S )NT)r  r  rf   s    r    test_dump_traceback_later_repeatz2FaultHandlerTests.test_dump_traceback_later_repeat      ''t'44444r   c                 2    |                      d           d S )NT)r  r  rf   s    r    test_dump_traceback_later_cancelz2FaultHandlerTests.test_dump_traceback_later_cancel  r  r   c                     t                      5 }|                     |           d d d            d S # 1 swxY w Y   d S r   )r%   r  r   s     r   test_dump_traceback_later_filez0FaultHandlerTests.test_dump_traceback_later_file  s    !! 	?X++X+>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?r   c                     t          j        d          5 }|                     |                                           d d d            d S # 1 swxY w Y   d S r   )r    r   r  r   r   s     r   test_dump_traceback_later_fdz.FaultHandlerTests.test_dump_traceback_later_fd  s     #E** 	<b++ryy{{+;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<r   c                 2    |                      d           d S )Nr   )r  r  rf   s    r   test_dump_traceback_later_twicez1FaultHandlerTests.test_dump_traceback_later_twice  s    ''a'00000r   registerzneed faulthandler.registerc                    	 t           j        }d}|                    ||||||          }|                     ||          \  }}	d                    |          }|s/|rd}
nd}
t          dd|
          }
|                     ||
           n|                     |d           |r|                     |	d	           d S |                     |	d	           d S )
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)
            )rG   signum
unregisterchainr$   r@   r   z8Current thread 0x[0-9a-f]+ \(most recent call first\):\nz#Stack \(most recent call first\):\nr       r-   r   )	signalSIGUSR1r   rF   rR   r   rS   r7   rT   )r>   r$   rG   r  r  r@   r  r?   r   rD   r   s              r   check_registerz FaultHandlerTests.check_register  s
   	 -\ {{#!  
 
 //$99x		%   	( ?S>&r2u55EUE****UB''' 	*!,,,,,Xq)))))r   c                 .    |                                   d S r   r#  rf   s    r   test_registerzFaultHandlerTests.test_register  s    r   c                 2    |                      d           d S )NT)r  r%  rf   s    r   test_unregisterz!FaultHandlerTests.test_unregister   s    t,,,,,r   c                     t                      5 }|                     |           d d d            d S # 1 swxY w Y   d S r   )r%   r#  r   s     r   test_register_filez$FaultHandlerTests.test_register_file  s    !! 	3X222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3r   c                     t          j        d          5 }|                     |                                           d d d            d S # 1 swxY w Y   d S r   )r    r   r#  r   r   s     r   test_register_fdz"FaultHandlerTests.test_register_fd  s     #E** 	0b299;;///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0r   c                 2    |                      d           d S )NTr   r%  rf   s    r   test_register_threadsz'FaultHandlerTests.test_register_threads  s    -----r   c                 2    |                      d           d S )NT)r  r%  rf   s    r   test_register_chainz%FaultHandlerTests.test_register_chain  s    $'''''r   c              #   2  K   t           j        }	 d t           _        |                     t                    5 }d V  d d d            n# 1 swxY w Y   |                     t          |j                  d           |t           _        d S # |t           _        w xY w)Nzsys.stderr is None)r   rC   assertRaisesRuntimeErrorr7   r  	exception)r>   rC   cms      r   check_stderr_nonez#FaultHandlerTests.check_stderr_none  s      	 CJ""<00 B              S..0DEEECJJJCJs-   &B AB AB A+B Bc                 F   |                                  5  t          j                     d d d            n# 1 swxY w Y   |                                  5  t          j                     d d d            n# 1 swxY w Y   |                                  5  t          j        d           d d d            n# 1 swxY w Y   t          t          d          rM|                                  5  t          j        t          j                   d d d            d S # 1 swxY w Y   d S d S )NgMbP?r  )	r6  r   r   dump_tracebackdump_traceback_laterhasattrr  r!  r"  rf   s    r   test_stderr_Nonez"FaultHandlerTests.test_stderr_None  s    ##%% 	" 	"!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"##%% 	* 	*')))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*##%% 	4 	4-d333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4<,, 	6'')) 6 6%fn5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6	6 	6sB   599A44A8;A8B44B8;B8(DDDzspecific to Windowsc                 L    dD ] \  }}|                      d| dd|           !d S )N))EXCEPTION_ACCESS_VIOLATIONrd   )EXCEPTION_INT_DIVIDE_BY_ZEROzint divide by zero)EXCEPTION_STACK_OVERFLOWzstack overflowz
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(faulthandler._r   rc   )r`   )r>   excr   s      r   test_raise_exceptionz&FaultHandlerTests.test_raise_exception+  sb    
 	 	IC
 (( * >A* * *
    	 	r   c                     dD ][}d| d}t          |          }|                     |          \  }}|                     |g            |                     ||           \d S )N)l   cs@ l   RC@ z
                    import faulthandler
                    faulthandler.enable()
                    faulthandler._raise_exception(z)
                    r	   rF   r7   )r>   exc_coder?   rB   rD   s        r   test_ignore_exceptionz'FaultHandlerTests.test_ignore_exception:  s    
 	1 	1H 4<  D
 $<<D#t44FHVR(((Xx0000	1 	1r   c                     dD ]P}|                      d|dd          \  }}|                     |g            |                     |||dz  f           Qd S )N)r   ixV4i   @i  @i   piz{
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(0xr   r   i)rF   r7   r   )r>   r@  rB   rD   s       r   test_raise_nonfatal_exceptionz/FaultHandlerTests.test_raise_nonfatal_exceptionJ  s    
 	4 	4C  $ 0 250 0 0 0    FH VR((( MM(k 124 4 4 4#	4 	4r   c                     t          d          }|                     |          \  }}|                     |g            |                     |d           d S )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            code = faulthandler._EXCEPTION_ACCESS_VIOLATION
            faulthandler._raise_exception(code)
        l       rC  r>   r?   rB   rD   s       r    test_disable_windows_exc_handlerz2FaultHandlerTests.test_disable_windows_exc_handlerf  s`         ??400$$$:.....r   c                     t          d          }|                     |          \  }}|                     |g            |                     |d           d S )Nz`
            import faulthandler
            faulthandler.cancel_dump_traceback_later()
        r   rC  rI  s       r   .test_cancel_later_without_dump_traceback_laterz@FaultHandlerTests.test_cancel_later_without_dump_traceback_laters  sb          ??400$$$1%%%%%r   )NNr   )FFr   )FFFFN)J__name__
__module____qualname__rF   rW   r^   r`   r   r   r   platform
startswithrg   r   rk   rp   rs   rv   ry   	_testcapi
skipUnlessr:  r!  r}   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  r  r  r  r  r  r  r#  r&  r(  r*  r,  r.  r0  r   r6  r;  re   rA  rE  rG  rJ  rL  r   r   r   r'   r'   3   s       - - - -D "t#(','%) %) %) %) %)N? ? ? ?? ? ? X_S\,,U33LN N$ $N N$* " " " !% !% !%F
! 
! 
!   X_S\W,9; ;( (; ;( X_Y$&(899X224HII	 	  JI :9	 X_Y$&(899X224HII	# 	#  JI :9	#
% 
% 
%+ + +* * * X_S\,,Y77BC C X_/@AAA:< << << <C C
< " " " dt 5@ A A A
# 
# A A
# X_S\W,EG Gdt 5@ A A A  A AG G
    ) ) ) ) ) )&% % %, !W ""4 4 #"4 !W ""
3 
3 #"
3 !W ""3 3 #"3$ 04 ,& ,& ,& ,& ,&\$ $ $9 9 9 X_S\W,EG G6 6G G6& & &09& 9& 9&v0 0 08 8 8<&/3<& <& <& <& <&|* * *5 5 55 5 5? ? ? X_S\W,EG G< <G G<1 1 1 X_z:::13 39>9=O* O* O*3 3O*b  - - -3 3 3 X_S\W,EG G0 0G G0. . .( ( (     ^ 6 6 6 X%:;;  <; X%:;;1 1 <;1 X%:;;4 4 <;46 X%:;;
/ 
/ <;
/	& 	& 	& 	& 	&r   r'   __main__)r   )"
contextlibr   r  r   r:   r   r!  r   r   r   r   test.supportr   r   r   r   r    r   textwrapr	   rR  ImportErrorhas_subprocess_supportSkipTestr	  r   re   r   r   r%   TestCaser'   rM  mainr   r   r   <module>r^     s   % % % % % %      				 				      



       " " " " " " 2 2 2 2 2 2 2 2 * * * * * *           III % ?
(
=
>
>>
go
! ! ! !M M M
 # # #I& I& I& I& I&) I& I& I&X zHMOOOOO s   A AA