Current File : //usr/local/apps/python3/lib/python3.11/test/__pycache__/test_faulthandler.cpython-311.opt-2.pyc
�

�Ke?y���ddlmZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddlm
Z
mZddlmZddlZddlZddlmZ	ddlZn
#e$rdZYnwxYwe
jsejd���d	Zejd
kZdd�Zd
�Zed���ZGd�dej��Ze dkrej!��dSdS)�)�contextmanagerN)�support)�	os_helper)�
script_helper�
is_android)�skip_if_sanitizer)�dedentztest module requires subprocessg�?�nt�c�d�|}|d|zz
}|d|zz
}d|krd|dz|dz
zz|zSd|zdzS)Nz#  File "<string>", line %s in func
z&  File "<string>", line %s in <module>r�^�
�$�)�lineno1�lineno2�header�	min_count�regexs     �@/usr/local/apps/python3/lib/python3.11/test/test_faulthandler.py�expected_tracebackrs\���E�	�
3�g�
=�=�E�	�
5��
?�?�E��9�}�}��e�d�l�y�1�}�5�5��=�=��U�{�S� � �c�H�tjtd��|��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�Mrc#�K�tj��}	|V�tj|��dS#tj|��wxYw�N)�tempfile�mktempr�unlink��filenames r�temporary_filenamer%+sO������ � �H�#��������"�"�"�"�"��	���"�"�"�"���s	�1�Ac	�*�eZdZdRd�Zddddddddd�d�ZdSd�Zd	�Zeje	j
�d
��d��d���Ze
d
���Ze
d���Zd�Zd�Zeje	j
dkd��d���Zejedud��ejeed��d��e
d�������Zejedud��ejeed��d��e
d�������Zd�Zd�Zd�Zeje	j
�d��d��ejeed ��d!��d"�����Ze
d#���Zeddd$�%��e
d&�����Z eje	j
dkd'��eddd$�%��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*ddd0�d1�Z+d2�Z,d3�Z-eje	j
dkd'��d4���Z.d5�Z/d6�Z0d7�Z1d8�Z2dTddd0�d:�Z3d;�Z4d<�Z5d=�Z6d>�Z7eje	j
dkd'��d?���Z8d@�Z9ejeedA��dB��		dUdC���Z:dD�Z;dE�Z<dF�Z=eje	j
dkd'��dG���Z>dH�Z?dI�Z@eAdJ���ZBdK�ZCejeDdL��dM���ZEejeDdL��dN���ZFejeDdL��dO���ZGejeDdL��dP���ZHdQ�ZIdS)V�FaultHandlerTestsNc���	t|�����}g}|�|�|��tj��5tjd||���}|5|���\}}|���}ddd��n#1swxYwYddd��n#1swxYwY|�	dd��}|ri|�
|d��t|d��5}	|	���}ddd��n#1swxYwY|�	dd��}n�|��|�
|d��tj|tjd��t|dd�	��5}	|	���}ddd��n#1swxYwY|�	dd��}|���|fS)
N�-c)�pass_fds�ascii�backslashreplace��rbrF)�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_outputzFaultHandlerTests.get_output5s���	��d�|�|�!�!�#�#����
�>��O�O�B����
�
(�
*�
*�	*�	*�#�0��t�h�O�O�O�G��
*�
*�!(�!4�!4�!6�!6����"�<�<�>�>��
*�
*�
*�
*�
*�
*�
*�
*�
*�
*�
*����
*�
*�
*�
*�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*����	*�	*�	*�	*�
���w�(:�;�;���
	@����V�R�(�(�(��h��%�%�
#��������
#�
#�
#�
#�
#�
#�
#�
#�
#�
#�
#����
#�
#�
#�
#��]�]�7�,>�?�?�F�F�
�^����V�R�(�(�(��H�R���a�(�(�(��b�$��.�.�.�
#�"�������
#�
#�
#�
#�
#�
#�
#�
#�
#�
#�
#����
#�
#�
#�
#��]�]�7�,>�?�?�F�� � �"�"�H�,�,sZ�B8�),B!�B8�!B%	�%B8�(B%	�)B8�8B<�?B<�D"�"D&�)D&�F/�/F3�6F3TFz<module>)r$�all_threads�other_regexr@�know_current_thread�py_fatal_error�garbage_collecting�functionc��	|r|rd}nd}nd}d|��g}
|	r|
�d��|
�d��|
�|�d���|
r|
�d��|
�d	|�d
|����d�|
��}
|r	d|
�d
|�d�}
d|
��}
|�|||���\}}d�|��}|�||
��|�|d��dS)NzCurrent 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 "<string>", line z in rz(?:�|�)z(?m)�r$r@r)r1�joinrF�assertRegex�assertNotEqual)r>r?�lineno�fatal_errorr$rGrHr@rIrJrKrLrrrBrDs                r�check_errorzFaultHandlerTests.check_errorVs_��	��	�"�
.�5���-����F�"�[�"�"�#���	>��L�L�<�=�=�=�
���R����
����=�=�=�>�>�>��	1��L�L�/�0�0�0�
���G��G�G�X�G�G�H�H�H��	�	�%� � ���	1�0�%�0�0�+�0�0�0�E��u�����?�?�4�(�r�?�J�J�������6�"�"�������'�'�'����H�a�(�(�(�(�(rc�B�|r|�d|��}d|z}|j|||fi|��dS)Nz: zFatal Python error: %s�rW)r>r?�line_number�
name_regex�func�kwrVs       r�check_fatal_errorz#FaultHandlerTests.check_fatal_error}sI���	7�%)�T�T�:�:�6�J�.��;������{�K�>�>�2�>�>�>�>�>rc�0�d|z}|j|||fi|��dS)NzWindows fatal exception: %srY)r>r?rZr[r]rVs      r�check_windows_exceptionz)FaultHandlerTests.check_windows_exception�s1��3�j�@������{�K�>�>�2�>�>�>�>�>r�aixz5the first page of memory is a mapped read-only on AIXc�t�ts|�ddd��dS|�ddd��dS)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���	$��"�"�$�
�,�	
-�	
-�	
-�	
-�	
-�
�(�(�*�
�"�

$�
$�
$�
$�
$rc�4�|�ddd��dS)Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv()
            rc�Segmentation fault�r^rfs r�test_sigsegvzFaultHandlerTests.test_sigsegv��1����� �

� �
	"�	"�	"�	"�	"rc�:�|�ddddd���dS)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)rLrKrjrfs r�test_gczFaultHandlerTests.test_gc�s>��	
��� �8
� ��#�?	�	%�	%�	%�	%�	%rc�<�|�dddddd���dS)Nz�
            import faulthandler
            faulthandler.enable()
            faulthandler._fatal_error_c_thread()
            rcz
in new threadF�faulthandler_fatal_error_threadT)rIr\rJrjrfs r�test_fatal_error_c_threadz+FaultHandlerTests.test_fatal_error_c_thread�s?����� �

�� %�2��	�		!�		!�		!�		!�		!rc�4�|�ddd��dS)Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigabrt()
            rc�Abortedrjrfs r�test_sigabrtzFaultHandlerTests.test_sigabrt�s1����� �

��
	�	�	�	�	r�win32z"SIGFPE cannot be caught on Windowsc�4�|�ddd��dS)Nzr
            import faulthandler
            faulthandler.enable()
            faulthandler._sigfpe()
            rczFloating point exceptionrjrfs r�test_sigfpezFaultHandlerTests.test_sigfpe�s3��	
��� �

�&�
	(�	(�	(�	(�	(rzneed _testcapi�SIGBUSzneed signal.SIGBUSc�4�|�ddd��dS)Nz�
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGBUS)
            �z	Bus errorrjrfs r�test_sigbuszFaultHandlerTests.test_sigbus�s3��	
��� �
��	�	�	�	�	r�SIGILLzneed signal.SIGILLc�4�|�ddd��dS)Nz�
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGILL)
            r|zIllegal instructionrjrfs r�test_sigillzFaultHandlerTests.test_sigill�s3��	
��� �
�!�	#�	#�	#�	#�	#rc��tj��5|�d|�d�dddd���ddd��dS#1swxYwYdS)NzP
                import _testcapi
                _testcapi.fatal_error(b'xyz', �)
                ��xyz�test_fatal_errorT)r\rJ)rr2r^)r>�release_gils  r�check_fatal_error_funcz(FaultHandlerTests.check_fatal_error_funcs���
�
(�
*�
*�	%�	%��"�"�$�/:�$�$�$���'�#�
#�
%�
%�
%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%����	%�	%�	%�	%�	%�	%s�A�A�Ac�0�|�d��dS)NF�r�rfs rr�z"FaultHandlerTests.test_fatal_errors���#�#�E�*�*�*�*�*rc�0�|�d��dS)NTr�rfs r�test_fatal_error_without_gilz.FaultHandlerTests.test_fatal_error_without_gils���#�#�D�)�)�)�)�)r�openbsdzVIssue #12868: sigaltstack() doesn't work on OpenBSD if Python is compiled with pthread�_stack_overflowz#need faulthandler._stack_overflow()c�8�|�dddd���dS)Nzz
            import faulthandler
            faulthandler.enable()
            faulthandler._stack_overflow()
            rcz (?:Segmentation fault|Bus error)z unable to raise a stack overflow)rHrjrfs r�test_stack_overflowz%FaultHandlerTests.test_stack_overflows;��	
��� �

�.�:�	�	<�	<�	<�	<�	<rc�4�|�ddd��dS)Nzw
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv(True)
            rcrirjrfs r�test_gil_releasedz#FaultHandlerTests.test_gil_released)rlrz0sanitizer builds change crashing process output.)�memory�ub�reasonc���t��5}|�d�t|�����dd|���ddd��dS#1swxYwYdS)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_file3s��� �
!�
!�		#�X��"�"�$�
�F�D��N�N�F�3�3��$�!�
#�
#�
#�
#�		#�		#�		#�		#�		#�		#�		#�		#�		#�		#�		#�		#����		#�		#�		#�		#�		#�		#s�;A�A�Az.subprocess doesn't support pass_fds on Windowsc��tjd��5}|���}|�d|zdd|���ddd��dS#1swxYwYdS)N�wb+z�
                import faulthandler
                import sys
                faulthandler.enable(%s)
                faulthandler._sigsegv()
                r�ri�r@)r �
TemporaryFile�filenor^)r>rEr@s   r�test_enable_fdz FaultHandlerTests.test_enable_fdBs����
#�E�
*�
*�
	�b������B��"�"�$�
�$��$��
#�
�
�
�
	�
	�
	�
	�
	�
	�
	�
	�
	�
	�
	�
	����
	�
	�
	�
	�
	�
	s�1A�A�Ac�8�|�dddd���dS)Nz�
            import faulthandler
            faulthandler.enable(all_threads=False)
            faulthandler._sigsegv()
            rcriF�rGrjrfs r�test_enable_single_threadz+FaultHandlerTests.test_enable_single_threadTs9����� �

� ��	�	�	�	�	�	rc���d}d}|�|��\}}d�|��}|�||v|�d|����|�|d��dS)Nz�
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            faulthandler._sigsegv()
            zFatal Python errorrz is present in r)rFrR�
assertTruerT)r>r?�not_expectedrCrDs     r�test_disablezFaultHandlerTests.test_disable_s�����,���?�?�4�0�0�������6�"�"������F�2�.:�l�l�F�F�C�	E�	E�	E����H�a�(�(�(�(�(rc��d}|�|��\}}d�|��}tjd|tj��}|s|�d|����t
|�d������	d����}dD]}|�
||���dS)Nz�
            import faulthandler
            import sys
            # Don't filter stdlib module names
            sys.stdlib_module_names = frozenset()
            faulthandler.enable()
            faulthandler._sigsegv()
            rz*^Extension modules:(.*) \(total: [0-9]+\)$z$Cannot find 'Extension modules:' in rz, )�sys�faulthandler)rFrR�re�search�	MULTILINE�fail�set�groupr0�split�assertIn)r>r?rCrD�match�modules�names       r�test_dump_ext_modulesz'FaultHandlerTests.test_dump_ext_modulesns����� �?�?�4�0�0�������6�"�"���	�G� �"�,�0�0���	I��I�I�G�V�G�G�H�H�H��e�k�k�!�n�n�*�*�,�,�2�2�4�8�8�9�9��+�	)�	)�D��M�M�$��(�(�(�(�	)�	)rc�B�tj}	tjt_tj��}	tj��|�tj����tj��|�tj����|rtj��nBtj��n.#|rtj��wtj��wxYw|t_dS#|t_wxYwr)	r�rC�
__stderr__r��
is_enabled�enabler��disable�assertFalse)r>�orig_stderr�was_enableds   r�test_is_enabledz!FaultHandlerTests.test_is_enabled�s����j��	%���C�J�&�1�3�3�K�	
+��#�%�%�%����� 7� 9� 9�:�:�:��$�&�&�&�� � ��!8�!:�!:�;�;�;��+� �'�)�)�)�)� �(�*�*�*�*���+� �'�)�)�)�)� �(�*�*�*�*����$�C�J�J�J���C�J�$�$�$�$s#�)D�A2C�**D�+C?�?D�Dc��d}tjdd|f}tj|��}|�|���d��dS)N�5import faulthandler; print(faulthandler.is_enabled())�-Er)�False)r��
executable�
subprocess�check_outputr7�rstrip)r>r?�argsrBs    r�test_disabled_by_defaultz*FaultHandlerTests.test_disabled_by_default�sN��G�����d�D�1���(��.�.����������(�3�3�3�3�3rc	�T�d}tdtjtjjrdndddd|f��}t
j���}|�dd��tj
||���}|�|���d	��dS)
Nr�r�r-z-Xr�r)�PYTHONFAULTHANDLER��env�True)
�filterr�r��flags�ignore_environmentr:�environ�copy�popr�r�r7r��r>r?r�r�rBs     r�test_sys_xoptionsz#FaultHandlerTests.test_sys_xoptions�s���G���d�S�^�%(�Y�%A�I�T�T�r�!�>�4��?�@�@���j�o�o�������$�d�+�+�+��(��3�7�7�7����������'�2�2�2�2�2rc��d}tjd|f}ttj��}d|d<d|d<tj||���}|�|���d��ttj��}d|d<d|d<tj||���}|�|���d	��dS)
Nr�r)r-r��
PYTHONDEVMODEr�r��1r�)	r�r��dictr:r�r�r�r7r�r�s     r�test_env_varzFaultHandlerTests.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�2rrQc���	d}|�||���}|rd}n|�d}nd}dd|zdd	g}|�|||��\}}|�||��|�|d
��dS)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()
            rQrn���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�rFr7)r>r$r@r?rU�expected�tracerDs        r�check_dump_tracebackz&FaultHandlerTests.check_dump_traceback�s���	���*�{�{����
�
���	��F�F�
�^��F�F��F�-�1�F�:�1�4�	
���/�/�$��"�=�=���x������)�)�)�����1�%�%�%�%�%rc�.�|���dSr)r�rfs r�test_dump_tracebackz%FaultHandlerTests.test_dump_traceback�s���!�!�#�#�#�#�#rc��t��5}|�|���ddd��dS#1swxYwYdS�Nr#)r%r�r�s  r�test_dump_traceback_filez*FaultHandlerTests.test_dump_traceback_file�s���
�
!�
!�	9�X��%�%�x�%�8�8�8�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9����	9�	9�	9�	9�	9�	9��3�7�7c��tjd��5}|�|������ddd��dS#1swxYwYdS�Nr�r�)r r�r�r��r>rEs  r�test_dump_traceback_fdz(FaultHandlerTests.test_dump_traceback_fd�s����
#�E�
*�
*�	6�b��%�%������%�5�5�5�	6�	6�	6�	6�	6�	6�	6�	6�	6�	6�	6�	6����	6�	6�	6�	6�	6�	6��)A�A�Ac���d}d|dzz}d|zdz}d}|�|���}dd|zd	g}|�|��\}}|�||��|�|d
��dS)Ni��x�2z...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>rr�)r>�maxlenr��	truncatedr?r�r�rDs        r�
test_truncatezFaultHandlerTests.test_truncate�s������6�B�;�'�	��&�L�5�(�	����{�{���
�
��
.�-�	�9�3�
��
�/�/�$�/�/���x������)�)�)�����1�%�%�%�%�%rc��	d}|�t|�����}|�||��\}}d�|��}|rd}nd}d}t	|�|��������}|�||��|�|d��dS)	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>$
            )rUr)r�r�rFrRr	r0rSr7)r>r$r?rBrDrUrs       r�check_dump_traceback_threadsz.FaultHandlerTests.check_dump_traceback_threadss���	���@�{�{�D��N�N�{�3�3���?�?�4��:�:�������6�"�"���	��F�F��F�
���u�|�|�6�|�2�2�3�3�9�9�;�;�������'�'�'�����1�%�%�%�%�%rc�0�|�d��dSr)r�rfs r�test_dump_traceback_threadsz-FaultHandlerTests.test_dump_traceback_threadsOs���)�)�$�/�/�/�/�/rc�~�t��5}|�|��ddd��dS#1swxYwYdSr)r%r�r�s  r� test_dump_traceback_threads_filez2FaultHandlerTests.test_dump_traceback_threads_fileRs���
�
!�
!�	8�X��-�-�h�7�7�7�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8����	8�	8�	8�	8�	8�	8s�2�6�6rc���	ttjt�����}d}|�t|||||���}|�||��\}}	d�|��}|s8|}
|r|
dz}
d|z}tdd||
�	��}|�||��n|�	|d
��|�	|	d��dS)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@rr�zATimeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n��)rr-r)
�str�datetime�	timedelta�TIMEOUTr�rFrRrrSr7)
r>rrrr$r@�timeout_strr?r�rD�countrrs
             r�check_dump_traceback_laterz,FaultHandlerTests.check_dump_traceback_laterVs��	��(�,�W�=�=�=�>�>����<�{�{�������
�
�
���/�/�$��9�9���x��	�	�%� � ���	(��E��
���
��Y�\g�g�F�&�r�2�v��G�G�G�E����U�E�*�*�*�*����U�B�'�'�'�����1�%�%�%�%�%rc�.�|���dSr�rrfs r�test_dump_traceback_laterz+FaultHandlerTests.test_dump_traceback_later�s���'�'�)�)�)�)�)rc�2�|�d���dS)NT)rrrfs r� test_dump_traceback_later_repeatz2FaultHandlerTests.test_dump_traceback_later_repeat�����'�'�t�'�4�4�4�4�4rc�2�|�d���dS)NT)rrrfs r� test_dump_traceback_later_cancelz2FaultHandlerTests.test_dump_traceback_later_cancel�rrc��t��5}|�|���ddd��dS#1swxYwYdSr�)r%rr�s  r�test_dump_traceback_later_filez0FaultHandlerTests.test_dump_traceback_later_file�s���
�
!�
!�	?�X��+�+�X�+�>�>�>�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?����	?�	?�	?�	?�	?�	?r�c��tjd��5}|�|������ddd��dS#1swxYwYdSr�)r r�rr�r�s  r�test_dump_traceback_later_fdz.FaultHandlerTests.test_dump_traceback_later_fd�s����
#�E�
*�
*�	<�b��+�+�r�y�y�{�{�+�;�;�;�	<�	<�	<�	<�	<�	<�	<�	<�	<�	<�	<�	<����	<�	<�	<�	<�	<�	<r�c�2�|�d���dS)Nr�)rrrfs r�test_dump_traceback_later_twicez1FaultHandlerTests.test_dump_traceback_later_twice�s���'�'�a�'�0�0�0�0�0r�registerzneed faulthandler.registerc��	tj}d}|�||||||���}|�||��\}}	d�|��}|s/|rd}
nd}
tdd|
��}
|�||
��n|�|d��|r|�|	d	��dS|�|	d	��dS)
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@rz8Current thread 0x[0-9a-f]+ \(most recent call first\):\nz#Stack \(most recent call first\):\nr�� r-r)	�signal�SIGUSR1r�rFrRrrSr7rT)r>r$rGrrr@rr?r�rDrs           r�check_registerz FaultHandlerTests.check_register�s
��	����-��\�{�{�#��!����
�
�
���/�/�$��9�9���x��	�	�%� � ���	(��
?�S���>��&�r�2�u�5�5�E����U�E�*�*�*�*����U�B�'�'�'��	*�����!�,�,�,�,�,����X�q�)�)�)�)�)rc�.�|���dSr�r#rfs r�
test_registerzFaultHandlerTests.test_register�s���������rc�2�|�d���dS)NT)rr%rfs r�test_unregisterz!FaultHandlerTests.test_unregisters�����t��,�,�,�,�,rc��t��5}|�|���ddd��dS#1swxYwYdSr�)r%r#r�s  r�test_register_filez$FaultHandlerTests.test_register_files���
�
!�
!�	3�X������2�2�2�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3����	3�	3�	3�	3�	3�	3r�c��tjd��5}|�|������ddd��dS#1swxYwYdSr�)r r�r#r�r�s  r�test_register_fdz"FaultHandlerTests.test_register_fds����
#�E�
*�
*�	0�b����2�9�9�;�;��/�/�/�	0�	0�	0�	0�	0�	0�	0�	0�	0�	0�	0�	0����	0�	0�	0�	0�	0�	0r�c�2�|�d���dS)NTr�r%rfs r�test_register_threadsz'FaultHandlerTests.test_register_threads
s�������-�-�-�-�-rc�2�|�d���dS)NT)rr%rfs r�test_register_chainz%FaultHandlerTests.test_register_chains�����$��'�'�'�'�'rc#�2K�tj}	dt_|�t��5}dV�ddd��n#1swxYwY|�t|j��d��|t_dS#|t_wxYw)Nzsys.stderr is None)r�rC�assertRaises�RuntimeErrorr7r�	exception)r>rC�cms   r�check_stderr_nonez#FaultHandlerTests.check_stderr_nones��������	 ��C�J��"�"�<�0�0�
�B�����
�
�
�
�
�
�
�
�
�
�
����
�
�
�
����S���.�.�0D�E�E�E��C�J�J�J���C�J����s-�&B�A�B�A�B�A�+B�Bc�F�|���5tj��ddd��n#1swxYwY|���5tj��ddd��n#1swxYwY|���5tjd��ddd��n#1swxYwYttd��rM|���5tjtj��ddd��dS#1swxYwYdSdS)Ng����MbP?r)	r6r�r��dump_traceback�dump_traceback_later�hasattrrr!r"rfs r�test_stderr_Nonez"FaultHandlerTests.test_stderr_Nones
���
#�
#�
%�
%�	"�	"���!�!�!�	"�	"�	"�	"�	"�	"�	"�	"�	"�	"�	"����	"�	"�	"�	"�
�
#�
#�
%�
%�	*�	*��'�)�)�)�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*����	*�	*�	*�	*�
�
#�
#�
%�
%�	4�	4��-�d�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4��<��,�,�	6��'�'�)�)�
6�
6��%�f�n�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�4A8�;A8�B4�4B8�;B8�(D�D�Dzspecific to Windowsc�L�dD] \}}|�d|�d�d|���!dS)N))�EXCEPTION_ACCESS_VIOLATIONrd)�EXCEPTION_INT_DIVIDE_BY_ZEROzint divide by zero)�EXCEPTION_STACK_OVERFLOWzstack overflowz�
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(faulthandler._r�rc)r`)r>�excr�s   r�test_raise_exceptionz&FaultHandlerTests.test_raise_exception+sb��
�	�	�I�C��

�(�(�*�>A�*�*�*�
��

�
�
�
�	�	rc���dD][}d|�d�}t|��}|�|��\}}|�|g��|�||���\dS)N)lcs�@lRC�@z�
                    import faulthandler
                    faulthandler.enable()
                    faulthandler._raise_exception(z)
                    �r	rFr7)r>�exc_coder?rBrDs     r�test_ignore_exceptionz'FaultHandlerTests.test_ignore_exception:s���
�	1�	1�H��4<����D�
�$�<�<�D�#���t�4�4��F�H����V�R�(�(�(����X�x�0�0�0�0�	1�	1rc��dD]P}|�d|d�d���\}}|�|g��|�|||dzf���QdS)N)ri�xV4i@i@ipi���z{
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(0xr�r�i����)rFr7r�)r>r@rBrDs    r�test_raise_nonfatal_exceptionz/FaultHandlerTests.test_raise_nonfatal_exceptionJs���
�	4�	4�C� $���0�25�0�0�0�0� � ��F�H�
���V�R�(�(�(�
�M�M�(���k� 1�2�
4�
4�
4�
4�#	4�	4rc��td��}|�|��\}}|�|g��|�|d��dS)Nz�
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            code = faulthandler._EXCEPTION_ACCESS_VIOLATION
            faulthandler._raise_exception(code)
        lrC�r>r?rBrDs    r� test_disable_windows_exc_handlerz2FaultHandlerTests.test_disable_windows_exc_handlerfs`����
�
�� �?�?�4�0�0���������$�$�$�����:�.�.�.�.�.rc��td��}|�|��\}}|�|g��|�|d��dS)Nz`
            import faulthandler
            faulthandler.cancel_dump_traceback_later()
        rrCrIs    r�.test_cancel_later_without_dump_traceback_laterz@FaultHandlerTests.test_cancel_later_without_dump_traceback_laterssb����
�
�� �?�?�4�0�0���������$�$�$�����1�%�%�%�%�%r)NNr)FFr)FFFFN)J�__name__�
__module__�__qualname__rFrWr^r`rrr��platform�
startswithrgrrkrprsrvry�	_testcapi�
skipUnlessr:r!r}r�r�r�r�r�r�r�rr�r�r�r�r�r�r�requires_subprocessr�r�r�r�r�r�r�r�r�r�r�rrrrrrrr#r&r(r*r,r.r0rr6r;rerArErGrJrLrrrr'r'3s�������-�-�-�-�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�2�4H�I�I��	�	���J�I�:�9�	��X�_�Y�$�&�(8�9�9��X������2�2�4H�I�I��	#�	#���J�I�:�9�	#�
%�
%�
%�+�+�+�*�*�*��X�_�S�\�,�,�Y�7�7�B�C�C��X�_����/@�A�A�A�:�<�<�<�<�<�<�C�C�
<��"�"���"���d�t�5@�A�A�A��
#�
#���A�A�
#��X�_�S�\�W�,�E�G�G���d�t�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&�v0�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�3�9>�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�<�;�4�6�X���%:�;�;�
/�
/�<�;�
/�	&�	&�	&�	&�	&rr'�__main__)r)"�
contextlibrrr�r:r�r!r�r�rr�test.supportrrrrr r�textwrapr	rR�ImportError�has_subprocess_support�SkipTestr	r�rerrr%�TestCaser'rM�mainrrr�<module>r^s���%�%�%�%�%�%���������	�	�	�	�	�	�	�	�
�
�
�
�����
�
�
�
�������"�"�"�"�"�"�2�2�2�2�2�2�2�2�*�*�*�*�*�*���������������������������I�I�I������%�?�
�(�
�=�
>�
>�>�

���g��o�
�!�!�!�!�M�M�M�
�#�#���#�I
&�I
&�I
&�I
&�I
&��)�I
&�I
&�I
&�X�z����H�M�O�O�O�O�O��s�A�A�A