
    3hh!)                     ^   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rS SKJ	r	  S SK
Jr  \R                  " S5      =(       d    Sr\ R                  R                  \ R                  R!                  \R"                  5      S5      r\ R                  R                  \ R                  R!                  \5      S5      rSrSrS	 rS
rS SS.S jrS r\" 5       u  rr\S:  a!  \R8                  " S\S     S\S    S\ 35      eS r\" 5         S r\" 5       rS r  " S S\RB                  \5      r"g)    N)support)ExtraAssertionsgdbzpython-gdb.pyzgdb_sample.py
builtin_id123c                      [         R                  R                  5        V Vs0 s H  u  pU R                  S5      (       a  M  X_M!     snn $ s  snn f )NPYTHON)osenvironitems
startswith)namevalues     ;/opt/python-3.13.8/usr/lib/python3.13/test/test_gdb/util.pyclean_environmentr      sF    +-::+;+;+= .+=KD??8, DK+= . . .s   AA)r   r   T)exitcodecheckc                 $   [        5       nU(       a  UR                  U5        [        SS/n[        S:  a  UR	                  SS[
         345        UR	                  U5        [        R                  " U[        R                  [        R                  [        R                  SSUS9nUR                  nUR                  nU(       aK  UR                  U :w  a;  [        R                  " U5      n	[        U	 S	UR                   S
U  SU< SU< 3	5      eXx4$ )zRuns gdb in --batch mode with the additional arguments given by *args.

Returns its (stdout, stderr) decoded from utf-8 using the replace handler.
z--batchz-nx      z--init-eval-commandzadd-auto-load-safe-path utf8backslashreplace)stdinstdoutstderrencodingerrorsenvz failed with exit code z, expected exit code z	:
stdout=z
stderr=)r   updateGDB_PROGRAMGDB_VERSIONextendCHECKOUT_HOOK_PATH
subprocessrunPIPEr   r   
returncodeshlexjoin	Exception)
r   r   argsenv_varsr   cmdprocr   r   cmd_texts
             r   run_gdbr1   "   s   
 
C

8  C f

)./A.BCE 	FJJt>>oo 2D [[F[[FH,::c?8*$;DOO;L M..6Z 8""( ,""(- . 	.
     c                  <    [        S5      u  p[        R
                  " SU 5      nUc  [        SU -  5      eU n[        UR                  S5      5      n[        UR                  S5      5      nXV4nXG4$ ! [         a  n[        R                  " SU 35      eS nAff = f)Nz	--versionz'Couldn't find gdb program on the path: z ^(?:GNU|HP) gdb.*?\b(\d+)\.(\d+)zunable to parse gdb version: %r      )	r1   OSErrorunittestSkipTestresearchr+   intgroup)r   r   excmatchversion_textmajorminorversions           r   get_gdb_versionrC   L   s    Q - II96BE}9FBCCLAEAEnG""%  Q "I# OPPQs   A3 3
B=BB)r   r   zIgdb versions before 7.0 didn't support python embedding. Saw gdb version .r4   z:
c                      [        SS[        R                  SS9u  pSU;   a  [        R                  " SU< 35      eU (       d  [        R                  " SU< 35      eSU ;   a  [        R                  " S	5      eg )
Nz9--eval-command=python import sys; print(sys.version_info)--argsF)r   zauto-loading has been declinedz;gdb security settings prevent use of custom hooks; stderr: z4gdb not built with embedded python support; stderr: zmajor=2zgdb built with Python 2)r1   sys
executabler7   r8   )r   r   s     r   check_usable_gdbrI   k   s     C#..NF
 (61j"# 	# j"# 	# F 9:: r2   c                      [         R                  " S5      n U (       d  gU R                  5       nSU;   =(       a    [        S U 5       5      $ )NCFLAGSFz-mcetc              3   ~   #    U  H3  nUR                  S 5      =(       a    UR                  S5      (       + v   M5     g7f)z-fcf-protection)z=nonez=returnN)r   endswith).0flags     r   	<genexpr>!cet_protection.<locals>.<genexpr>   s=      ' % __%67 A!]]+?@@A %s   ;=)	sysconfigget_config_varsplitany)cflagsflagss     r   cet_protectionrX      sL    %%h/FLLNE  ' ' %' '(r2   c                      [         R                  (       af  [        S[        S    S[        S    S35        [        R                  5        H  n [        SU -   5        M     [        S[         35        [        5         g g )Nzgdb version r   rD   r4   :z    z
    path: )r   verboseprintr"   GDB_VERSION_TEXT
splitlinesr!   )lines    r   setup_moduler`      sb    [^,Ak!n-=Q?@$//1D'D.! 2
;-() r2   c                   4    \ rS rSrSrSS\SSS4S jrS rSrg)DebuggerTests   z(Test that the debugger can debug Python.NFc                    SSU-  SS/n[         S:  a  US/-  nU(       a  [        (       a  US/-  nXt-  nOUS/-  nU Vs/ s H  nS	U-  PM
     n	nU	S
[        R                  /-  n	U	R	                  [
        R                  " 5       5        U(       d  U	S/-  n	U(       a  U	SU/-  n	OU(       a  X/-  n	[        U	S[        06u  pU(       d/  UR                  5        H  n[        U[        R                  S9  M     SU;   a  [        R                  " S5      eS H"  nX;   d  M
  [        R                  " U< S35      e   U
$ s  snf )z
Run 'python -c SOURCE' under gdb with a breakpoint.

Support injecting commands after the breakpoint is reached

Returns the stdout from gdb

cmds_after_breakpoint: if provided, a list of strings: gdb commands
zset breakpoint pending yeszbreak %szset print address offr&   r   zset print entry-values nonext	backtracez--eval-command=%srF   z-Sz-cPYTHONHASHSEED)filezPC not savedzKgdb cannot walk the frame object because the Program Counter is not present)z!(frame information optimized out)z*Unable to read information on python framez)(unable to read python frame information)z,Backtrace stopped: frame did not save the PCz ?? ()z found in gdb output)r"   CET_PROTECTIONrG   rH   r#   r%   _args_from_interpreter_flagsr1   rg   r^   r\   r   r7   r8   )selfsourcescript
breakpointcmds_after_breakpointimport_siteignore_stderrcommandsr.   r,   outerrr_   patterns                 r   get_stack_traceDebuggerTests.get_stack_trace   se   : )# $
. & 455H ~
 VH$-H%H
 6>>Xc#c)X>! 	!J;;=>TFNDT6N"DHD D@@(d, ) S ## %3 4 4
G$ ~''7+5I(JKK'
* 
m ?s   E c                     [         R                  " X![         R                  5      nU(       d  U R                  U< SU< 3S9  g g )Nz did not match )msg)r9   r>   DOTALLfail)rk   actualru   ms       r   assertMultilineMatches$DebuggerTests.assertMultilineMatches  s1    HHWbii0II67CID r2    )	__name__
__module____qualname____firstlineno____doc__BREAKPOINT_FNrv   r~   __static_attributes__r   r2   r   rb   rb      s#    2%)$#0.2$)&+	zxEr2   rb   )#r
   r9   r)   shutilr%   rG   rR   r7   testr   test.support.testcaser   whichr!   pathr*   dirnamerH   r$   __file__SAMPLE_SCRIPTr   rg   r   r"   r1   rC   r]   r8   rI   rX   ri   r`   TestCaserb   r   r2   r   <module>r      s7   	 	    
    1 ll5!*U WW\\"''//#.."A"13  RWW__X6H. T 'T#. !0 1  +


&q>*!KN+;3
	 ;,  
(  !CEH%% CEr2   