
    Xh[                    N   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mZ d dl	m
Z
mZmZmZ d dlmZmZ d dlZd dlZdZ	 da	  ej*                         Zg Z	  ej0                         Z G d de      Z G d d	ej8                        Zdd
Zd Zd Z d Z!ddZ"d Z#d Z$d Z%y)    )annotationsN)adapter)jsonlog	messagingsockets)
componentssessionsc                      e Zd ZU dZded<   ded<   	 ded<   	 ded<   ded	<   d
ed<   d Zd Zd Zd Zd Z	d Z
d Zd Zy)
Connectionaw  A debug server that is connected to the adapter.

    Servers that are not participating in a debug session are managed directly by the
    corresponding Connection instance.

    Servers that are participating in a debug session are managed by that sessions's
    Server component instance, but Connection object remains, and takes over again
    once the session ends.
    booldisconnectedprocess_replacedzServer | Noneserverz
int | Nonepidppidzmessaging.JsonMessageChannelchannelc                    ddl m} d _        d _        d  _        d  _        t        j                  j                  |t                     }t        j                  |        _         j                  j                          	  j                           j                  j                  d      } |dt        j                                } |dt"               _         |dt"        d	       _         j$                  d
k(  rd  _        t               x j                  _        |_        t(        5   j                  r
	 d d d        y t+         fdt,        D              rt/          d      t1        t,              dk(  }t,        j3                          t4        j7                          d d d         |jB                   j$                        }| |jB                   j
                        }|t;        jD                  d        n j
                  |j
                  k(  rU|j                  }|r|jF                  j                  s1t;        jH                  d|        j                  j?                          y 	 |jJ                  jM                          y ry t;        jD                  d        	  j                  j                  dddi        j                  j                  dd j
                  i        j                  j                  d        j                  j                  d       y # 1 sw Y   xY w# t8        $ r< t;        j<                  d        j                  j?                          tA                Y y w xY w# t8        $ r t;        j<                  d        Y w xY w# t8        $ r2 t;        j<                  d        j                  j?                          Y y w xY w)Nr   )r
   FpydevdSystemInfoprocessr   r   Toptional c              3  n   K   | ],  }|j                   j                   k(  xr |j                    . y wN)r   r   .0connselfs     K/var/www/html/myenv/lib/python3.12/site-packages/debugpy/adapter/servers.py	<genexpr>z&Connection.__init__.<locals>.<genexpr>c   s7       HH(F1F1F-FFs   25z% is already connected to this adapterz,Failed to accept incoming server connection:z2No active debug session for parent process of {0}.z!{0} is not expecting replacement.z*Failed to notify parent session about {0}:z(No clients to wait for - unblocking {0}.
initialize	adapterIDdebugpyattachsubProcessIdconfigurationDone
disconnectz&Failed to unblock orphaned subprocess:)'debugpy.adapterr
   r   r   r   r   r   JsonIOStreamfrom_socketstrJsonMessageChannelr   startauthenticaterequestr   objectintr   name_lockany_connectionsKeyErrorlenappend_connections_changedset	Exceptionr   swallow_exceptionclosedont_wait_for_first_connectiongetinfo
connectionerrorclientnotify_of_subprocess)	r   sockr
   streamrA   process_infois_first_serverparent_sessionparent_servers	   `        r    __init__zConnection.__init__?   s"   ,! %''33D#d)D 33FDA*	<<''(:;D	4;;=9L#E3/DH$VS4@DIyyB 	.1$i7DLL +
 $$+ +   ,  #dV+P#QRR"%l"3q"8##D)$((*'+D &dii0!)X\\$((3N!HHI4Pxx>--- . 5 5%-*B*B*S*SIIA>RLL&&(
%%::4@" ;TB	!LL  Y/GHLL  NDHH+EFLL  !45LL  .Q+ +*  	!!"PQLL  +,
 	8  
 %%@$0  	!!!"JKLL 	!s^   B)L. ,L!:L. A!L!$L. .M6 $A<N !L+&L. .AM32M36NN8OOc                H    d| j                   dz   S d| j                    dz   S )NServerz[?]z[pid=]r   r   s    r    __str__zConnection.__str__   s+    DHH$45NNE$((1:MNN    c                    t         t        j                   y | j                  j                  ddt         i      }|d   t        j                   k7  r%| j                  j	                          t        d      y )NpydevdAuthorizedebugServerAccessTokenclientAccessTokenz6Mismatched "clientAccessToken"; server not authorized.)access_tokenr   r   r0   r>   RuntimeError)r   auths     r    r/   zConnection.authenticate   sl    G$8$8$@||## 8,G
 #$(<(<<LL WXX =rS   c                $    |j                  d      Nz=Requests from the debug server to the client are not allowed.
isnt_validr   r0   s     r    r0   zConnection.request   s      K
 	
rS   c                     y r   r   r   events     r    rb   zConnection.event   s    rS   c                8    | j                   j                          y r   r   r>   ra   s     r    terminated_eventzConnection.terminated_event   s    rS   c                    t         5  d| _        | j                  | j                  j                          n1| t        v r)t        j                  |        t        j                          d d d        y # 1 sw Y   y xY wNT)r4   r   r   r(   r6   remover:   r;   rQ   s    r    r(   zConnection.disconnect   s`     		+ $D{{& &&(%##D)$((*		+ 		+ 		+s   A A00A9c                    t         5  | j                  t        t        j                  d| |       t        ||       | _        ddd       y# 1 sw Y   yxY w)zAttaches this server to the specified Session as a Server component.

        Raises ValueError if the server already belongs to some session.
        NzAttaching {0} to {1})r4   r   
ValueErrorr   rA   rN   r   sessions     r    attach_to_sessionzConnection.attach_to_session   sK      	0{{&  HH+T7; $/DK		0 	0 	0s   ;AAN)__name__
__module____qualname____doc____annotations__rL   rR   r/   r0   rb   re   r(   rm   r   rS   r    r   r   #   sf       
O
))d!LOY


+
0rS   r   c                  ,    e Zd ZU dZej
                  j                  Zded<    G d dej                        Z fdZ	e
d        Ze
d        Zd	 Zed
        Zed        Zed        Zed        Zed        Zedd       Zed        Zd Z fdZ xZS )rN   z1Handles the debug server side of a debug session.r   rB   c                      e Zd Zi ddddddddddddddd	dd
dddddddddddddddddddddddddg g g dZy)Server.CapabilitiessupportsCompletionsRequestFsupportsConditionalBreakpoints supportsConfigurationDoneRequestsupportsDataBreakpoints supportsDelayedStackTraceLoadingsupportsDisassembleRequestsupportsEvaluateForHoverssupportsExceptionInfoRequestsupportsExceptionOptionssupportsFunctionBreakpointssupportsGotoTargetsRequest!supportsHitConditionalBreakpointssupportsLoadedSourcesRequestsupportsLogPointssupportsModulesRequestsupportsReadMemoryRequestsupportsRestartFrameT)supportsRestartRequestsupportsSetExpressionsupportsSetVariablesupportsStepBacksupportsStepInTargetsRequestsupportsTerminateRequestsupportsTerminateThreadsRequestsupportsValueFormattingOptionsexceptionBreakpointFiltersadditionalModuleColumnssupportedChecksumAlgorithmsN)rn   ro   rp   
PROPERTIESr   rS   r    Capabilitiesru      s    
(%
,e
 /
 &u	

 /
 )%
 (
 +E
 '
 *5
 )%
 0
 +E
  
 %e
  (!
" #E#
$ ',%*#( %,1(,/4.3*,')+-9

rS   r   c                (   |j                   J |5  |j                   rJ t        | 	  ||j                         || _        | j
                  j                  J | j
                  j                  rl| j
                  j                  j                  | j                  k7  r?t        j                  d| j
                  j                  j                  | j                         | j                  | j
                  _        | |_         d d d        y # 1 sw Y   y xY w)N)r   z6Launcher reported PID={0}, but server reported PID={1})
r   superrL   r   rB   rl   r   launcherr   rA   )r   rl   rB   	__class__s      r    rL   zServer.__init__   s      ((( 	"~~%%GWj.@.@A(DO<<##+++||$$)>)>)B)Bdhh)NLLL))--HH
  $xxDLL!GN	" 	" 	"s   C-DDc                .    | j                   j                  S )z>Process ID of the debuggee process, as reported by the server.)rB   r   rQ   s    r    r   z
Server.pid  s     """rS   c                .    | j                   j                  S )zEParent process ID of the debuggee process, as reported by the server.)rB   r   rQ   s    r    r   zServer.ppid  s     ###rS   c                    |j                  d      sJ | j                  j                          | j                  j	                  |      }|j                          | j                  | |j                        | _        y )Nr"   )	
is_requestrB   r/   r   	propagatewait_for_responser   responsecapabilitiesr_   s     r    r"   zServer.initialize  sa    !!,///$$&,,((1!!# --dG4D4DErS   c                $    |j                  d      r\   r]   r_   s     r    r0   zServer.request"  s       K
 	
rS   c                :    | j                   j                  |       y r   )rD   propagate_after_startra   s     r    rb   zServer.event.  s    ))%0rS   c                     y r   r   ra   s     r    initialized_eventzServer.initialized_event2  s     	rS   c                T    | j                   s| j                  j                  |       y y r   )r   rD   r   ra   s     r    process_eventzServer.process_event7  s"     }}KK--e4 rS   c                l    | j                   j                  dvr| j                   j                  |       y y )N)visualstudiovsformac)rD   	client_idr   ra   s     r    continued_eventzServer.continued_event=  s/    * ;;  (DDKK--e4 ErS   c                     |dt         d      dk(  rd| j                  _        y | j                  s| j                  j                  |       y y )NpydevdReasonTr   processReplaced)r,   rB   r   r   rD   r   ra   s     r    exited_eventzServer.exited_eventU  sB    t48II
 04DOO, ==11%8 !rS   c                8    | j                   j                          y r   rd   ra   s     r    re   zServer.terminated_eventb  s     	rS   c                   t         5  d| _        | j                  | j                  _        t        | j                        x| j                  _        | j                  j                  _        d | j                  _        d d d        y # 1 sw Y   y xY w)NF)	r4   is_connectedrB   r   handlersr,   r3   rG   r   rQ   s    r    detach_from_sessionzServer.detach_from_sessiong  se     	* %D$(OODLL!;>t;OODLL 3 3 8%)DOO"		* 	* 	*s   A3BBc                     j                   j                  rmt        j                  d         j                  j
                  rj
                  j                  st         fdd       n j                   fdd       t        5  t        j                   j                          t        j                          d d d        t         =          y # 1 sw Y   xY w)Nz*{0} is waiting for replacement subprocess.c                6    | j                   j                   k(  S r   rP   )r   r   s    r    <lambda>z#Server.disconnect.<locals>.<lambda>v  s    $((dhh*> rS   <   )timeoutc                     j                    xsA j                   j                   xs( t         fdj                   j                  D              S )Nc              3  P   K   | ]  }|j                   j                   k(    y wr   rP   r   s     r    r!   z6Server.disconnect.<locals>.<lambda>.<locals>.<genexpr>}  s&       $ !HH0s   #&)rD   r   r5   known_subprocessesrk   s   r    r   z#Server.disconnect.<locals>.<lambda>z  sK    #NN* &~~::: (/(I(I  rS   )rB   r   r   rA   rl   rD   r   wait_for_connectionwait_forr4   r6   rh   r:   r;   r   r(   )r   rl   r   s   `@r    r(   zServer.disconnectn  s    ??++ HHA4HllG>>)D)D#>    
  	'0 $$&	' 		' 	's   4CC!)rb   zmessaging.Event)rn   ro   rp   rq   r	   	Componentmessage_handlerrr   r   rL   propertyr   r   r"   r0   rb   r   r   r   r   re   r   r(   __classcell__)r   s   @r    rN   rN      s    ; **::O
z.. 
@"& # # $ $F 
 
 1 1   5 5
 5 5. 
9 
9  * rS   rN   c                    t        j                  dt        | |      at	        j
                          t        j                  t              S )NrN   )r   server   listenerr
   report_socketsget_address)hostports     r    r   r     s3    }}Xz4>Hx((rS   c                     t         d uS r   )r   r   rS   r    
is_servingr     s    4rS   c                     	 t         t         j                          d a t        j                          y # t        $ r t        j                  d       Y 6w xY w)Nwarning)level)r   r>   r<   r   r=   r
   r   r   rS   r    stop_servingr     sI    /NNH   /I./s   3 AAc                 X    t         5  t        t              cd d d        S # 1 sw Y   y xY wr   )r4   listr6   r   rS   r    connectionsr     s"    	 "L!" " "s    )c                   fddk(  _         r.t        j                  d      }d|_        |j	                          dk7  rt        j                  d|        	 t        5  t        j                          fdt        D        }t        |d      }|j                   r|cddd       S 	 ddd       t        j                          m# 1 sw Y   xY w)	zWaits until there is a server matching the specified predicate connected to
    this adapter, and returns the corresponding Connection.

    If there is more than one server connection already available, returns the oldest
    one.
    c                     t        j                          d_        t        5  t        j                          d d d        y # 1 sw Y   y xY wrg   )timesleep	timed_outr4   r:   r;   )r   wait_for_timeouts   r    r   z-wait_for_connection.<locals>.wait_for_timeout  s<    

7%)" 	' $$&	' 	' 	's   AAr   z%servers.wait_for_connection() timeout)targetr3   Tz/{0} waiting for connection from debug server...c              3  4   K   | ]  } |      s|  y wr   r   )r   r   	predicates     r    r!   z&wait_for_connection.<locals>.<genexpr>  s     FdioTFs   N)r   	threadingThreaddaemonr.   r   rA   r4   r:   clearr6   nextwait)rl   r   r   threadconnsr   r   s    ``   @r    r   r     s    ' ")A!!#*Q
 !|BGL
 	 &&(FlFEt$D#3#=#=	 	 $>		 	!!# 	 	s   &?CCc                     	 t         j                          t        5  t         j                          t	        t
              s
	 ddd       y	 ddd       R# 1 sw Y   
xY w)zBlocks until all debug servers disconnect from the adapter.

    If there are no server connections, waits until at least one is established first,
    before waiting for it to disconnect.
    N)r:   r   r4   r   r8   r6   r   rS   r    wait_until_disconnectedr     sT     !!# 	 &&(|$	 	$	 	 	s   %AAc                 b    t         5  t        j                          ddd       y# 1 sw Y   yxY w)zlUnblocks any pending wait_until_disconnected() call that is waiting on the
    first server to connect.
    N)r4   r:   r;   r   rS   r    r?   r?     s(     
 #  "# # #s   %.c                   	
 t        j                  t              \  }}t        j                  t
        j                  j                  t        j                        d|dz   t        |      z   g}t        j                  |dt        j                  gz  }||z  }|dt               gz  }t        j                  d|       	 t        j                   |dt        j"                  t        j"                  t        j$                        	g 

j1                  d
j/                                
 fd}t3        j4                  |d  d	j6                  fd      j9                          	
 fd}t3        j4                  |d  dd      j9                          y # t&        $ r@}t        j(                  d        t+        j,                  d	j/                   |            d }~ww xY w)Nz	--connect:z--adapter-access-tokenz--pidz/Spawning attach-to-PID debugger injector: {0!r}r   )bufsizestdinstdoutstderrz7Failed to inject debug server into process with PID={0}z<Failed to inject debug server into process with PID={0}: {1}z$--- Starting attach to pid: {0} ---
c                   	 	 | j                         }|snI|j                  dd      }j                  |       t        j                  d|j                                \t        j                  d       y # t        $ rD t        j                         }t        j                  |        d|j                                Y y w xY w)Nzutf-8replacezInjector[PID={0}] output: {1}zInjector[PID={0}] exited.)filer   )readlinedecoder9   r   rA   rstripr<   ioStringIO	traceback	print_excgetvalue)rG   lines	on_outputoutput_collectedr   s      r    capturezinject.<locals>.capture  s    	.({{7I6 ''-8#t{{}M  HH0#6 	.AQ'h

-	.s   A3A7 7A
CCzInjector[PID=z] stdoutT)r   r3   argsr   c                 t   d} t        j                          }	 t        j                  d       j                         }|<|dk7  r6 dd       }g dj                  |      } ddj                  |             y t        j                          |z
  } dd		|fz         | ss|d
kD  rnd} t        j
                  dv rZ dd        dd        dd        dd        dd        dd        dd        dd        dd        dd       | r }g dj                  |      }|r	 d|       !)NFT   r   r   zAttach to PID failed.

 r   z'Attaching to PID: %s (elapsed: %.2fs).

   )linuxlinux2z3
The attach to PID is taking longer than expected.
z1On Linux it's possible to customize the value of
z<`PYDEVD_GDB_SCAN_SHARED_LIBRARIES` so that fewer libraries.
z4are scanned when searching for the needed symbols.

zHi.e.: set in your environment variables (and restart your editor/client
z>so that it picks up the updated environment variable value):

zCPYDEVD_GDB_SCAN_SHARED_LIBRARIES=libdl, libltdl, libc, libfreebl3

zA-- the actual library may be different (the gdb output typically
zE-- writes the libraries that will be used, so, it should be possible
z8-- to test other libraries if the above doesn't work).

)r   r   polljoinsysplatform)
taking_longer_than_expectedinitial_time
returncodeoldcontentselapsedinjectorr   r   r   s
         r    info_on_timeoutzinject.<locals>.info_on_timeout  s   &+#yy{JJqM!J%? 3
 +C')$!wws|Hh(9:iikL0GDW~U /R<26/||'::!$S "$P "$[ "$T "$g "$^ "$c "$` "$d "$X +&#% 773<h1Q rS   z] info on timeout)r   r3   r   )r   r   r   r  
executableospathdirnamer$   __file__r,   r   rX   r   rA   
subprocessPopenPIPESTDOUTr<   r=   r   MessageHandlingErrorformatr9   r   r   r   r.   )r   debugpy_argsr   r   r   cmdlineexcr   r  r  r   s   ` `      @@r    injectr    s   $$X.JD$ 	
(()s
SY	G ',g.B.BCC|GS""GHH>H
##//??$$
* CJJ3OP.  SE*oo	
 egL2\ }SE9J%KTXegq  
Es	
 ,,JQQS
 	
	
s    AF 	G;GG)z	127.0.0.1r   r   )&
__future__r   r  r  r  r   r   r$   r   debugpy.commonr   r   r   r   r)   r	   r
   r   r   rX   r   RLockr4   r6   Eventr:   r1   r   r   rN   r   r   r   r   r   r   r?   r  r   rS   r    <module>r#     s   
 # 	  
     8 8 0  	 9 6	 'y( p0 p0fqZ!! qh) "
$D#OrS   