o
    à›hæ]  ã                   @  s  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 ¡ Zg Z	 e ¡ ZG dd„ deƒZG dd	„ d	ejƒZddd„Zdd„ Zdd„ Z dd„ Z!ddd„Z"dd„ Z#dd„ Z$dd„ Z%dS )é    )ÚannotationsN)Úadapter)ÚjsonÚlogÚ	messagingÚsockets)Ú
componentsÚsessionsc                   @  s†   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d„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú
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           	        sŠ  ddl m} dˆ _dˆ _d ˆ _d ˆ _tj |t	ˆ ƒ¡}t 
|ˆ ¡ˆ _ˆ j ¡  zrˆ  ¡  ˆ j d¡}|dt ¡ ƒ}|dtƒˆ _|dtdd	�ˆ _ˆ jd
krOd ˆ _t	ˆ ƒ ˆ j_|_t�6 ˆ jrh	 W d   ƒ W d S t‡ fdd„tD ƒƒrztˆ › d�ƒ‚ttƒdk}t ˆ ¡ t ¡  W d   ƒ n1 s“w   Y  W n ty°   t d¡ ˆ j ¡  t ƒ  Y d S w | !ˆ j¡}|d u rÁ| !ˆ j¡}|d u rÌt "dˆ ¡ n6ˆ j|jkrè|j}|rÛ|j#jsèt $d|¡ ˆ j ¡  d S z	|j% &ˆ ¡ W d S  t�y   t dˆ ¡ Y nw |�rd S t "dˆ ¡ z"ˆ j dddi¡ ˆ j ddˆ ji¡ ˆ j d¡ ˆ j d¡ W d S  t�yD   t d¡ ˆ j ¡  Y d S w )Nr   )r	   FZpydevdSystemInfoÚprocessr   r   T©Úoptional© c                 3  s$   � | ]}|j ˆ j ko|j V  qd S ©N)r   r   ©Ú.0Úconn©Úselfr   úMc:\Users\shubh\Videos\agent\nova\Lib\site-packages\debugpy/adapter/servers.pyÚ	<genexpr>c   s
   € ÿ
ÿz&Connection.__init__.<locals>.<genexpr>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}.Ú
initializeZ	adapterIDÚdebugpyÚattachZsubProcessIdZconfigurationDoneÚ
disconnectz&Failed to unblock orphaned subprocess:)'Údebugpy.adapterr	   r   r   r   r   r   ZJsonIOStreamZfrom_socketÚstrZ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ÚclientZnotify_of_subprocess)	r   Úsockr	   Ústreamr7   Zprocess_infoZis_first_serverZparent_sessionZparent_serverr   r   r   Ú__init__?   s†   

úþ

í€

õ
ÿû
þzConnection.__init__c                 C  s"   d| j d u r	d S d| j › d� S )NÚServerz[?]z[pid=ú]©r   r   r   r   r   Ú__str__¥   s   "zConnection.__str__c                 C  sL   t d u rtj d u rd S | j ddt i¡}|d tj kr$| j ¡  tdƒ‚d S )NZpydevdAuthorizeZdebugServerAccessTokenZclientAccessTokenz6Mismatched "clientAccessToken"; server not authorized.)Úaccess_tokenr   r   r&   r4   ÚRuntimeError)r   Úauthr   r   r   r%   ¨   s   ÿ
þzConnection.authenticatec                 C  ó
   |  d¡‚©Nz=Requests from the debug server to the client are not allowed.©Z
isnt_valid©r   r&   r   r   r   r&   ²   s   ÿzConnection.requestc                 C  ó   d S r   r   ©r   Úeventr   r   r   rK   ·   s   zConnection.eventc                 C  ó   | j  ¡  d S r   ©r   r4   rJ   r   r   r   Úterminated_eventº   s   zConnection.terminated_eventc                 C  s€   t �4 d| _| jd ur| j ¡  n| tv r&t | ¡ t ¡  W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s9w   Y  d S ©NT)r*   r   r   r!   r,   Úremover0   r1   r   r   r   r   r!   ½   s   


÷ù"úzConnection.disconnectc                 C  sR   t � | jdur
t‚t d| |¡ t|| ƒ| _W d  ƒ dS 1 s"w   Y  dS )z—Attaches 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})r*   r   Ú
ValueErrorr   r7   r>   ©r   Úsessionr   r   r   Úattach_to_sessionÉ   s   
"üzConnection.attach_to_sessionN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r=   rA   r%   r&   rK   rN   r!   rT   r   r   r   r   r
   #   s$   
 
f
r
   c                      sÎ   e Zd ZU dZejjZded< G dd„ dejƒZ‡ fdd„Z	e
dd	„ ƒZe
d
d„ ƒZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed"dd„ƒZedd„ ƒZdd„ Z‡ fd d!„Z‡  ZS )#r>   z1Handles the debug server side of a debug session.r
   r8   c                   @  s’   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dS )zServer.CapabilitiesZsupportsCompletionsRequestFZsupportsConditionalBreakpointsZ supportsConfigurationDoneRequestZsupportsDataBreakpointsZ supportsDelayedStackTraceLoadingZsupportsDisassembleRequestZsupportsEvaluateForHoversZsupportsExceptionInfoRequestZsupportsExceptionOptionsZsupportsFunctionBreakpointsZsupportsGotoTargetsRequestZ!supportsHitConditionalBreakpointsZsupportsLoadedSourcesRequestZsupportsLogPointsZsupportsModulesRequestZsupportsReadMemoryRequestZsupportsRestartFrameT)ZsupportsRestartRequestZsupportsSetExpressionZsupportsSetVariableZsupportsStepBackZsupportsStepInTargetsRequestZsupportsTerminateRequestZsupportsTerminateThreadsRequestZsupportsValueFormattingOptionsZexceptionBreakpointFiltersZadditionalModuleColumnsZsupportedChecksumAlgorithmsN)rU   rV   rW   Z
PROPERTIESr   r   r   r   ÚCapabilitiesÝ   s`    ÿþýüûúùø	÷
öõôóòñðïärZ   c                   s¨   |j d u sJ ‚|�A |j rJ ‚tƒ j||jd� || _| jjd u s#J ‚| jjr:| jjj| jkr:t 	d| jjj| j¡ | j| j_| |_ W d   ƒ d S 1 sMw   Y  d S )N)r   z6Launcher reported PID={0}, but server reported PID={1})
r   Úsuperr=   r   r8   rS   r   Úlauncherr   r7   )r   rS   r8   ©Ú	__class__r   r   r=   ý   s   
ý
"ñzServer.__init__c                 C  ó   | j jS )z>Process ID of the debuggee process, as reported by the server.)r8   r   r   r   r   r   r     ó   z
Server.pidc                 C  r_   )zEParent process ID of the debuggee process, as reported by the server.)r8   r   r   r   r   r   r     r`   zServer.ppidc                 C  s@   |  d¡sJ ‚| j ¡  | j |¡}| ¡  |  | |j¡| _d S )Nr   )	Z
is_requestr8   r%   r   Ú	propagateZwait_for_responserZ   ÚresponseZcapabilitiesrH   r   r   r   r     s
   
zServer.initializec                 C  rE   rF   rG   rH   r   r   r   r&   "  s   ÿzServer.requestc                 C  s   | j  |¡ d S r   )r:   Úpropagate_after_startrJ   r   r   r   rK   .  s   zServer.eventc                 C  rI   r   r   rJ   r   r   r   Úinitialized_event2  s   zServer.initialized_eventc                 C  s   | j s| j |¡ d S d S r   )r\   r:   rc   rJ   r   r   r   Úprocess_event7  s   ÿzServer.process_eventc                 C  s    | j jdvr| j  |¡ d S d S )N)ZvisualstudioZvsformac)r:   Z	client_idrc   rJ   r   r   r   Úcontinued_event=  s   ÿzServer.continued_eventrK   úmessaging.Eventc                 C  s8   |dt dd�dkrd| j_d S | js| j |¡ d S d S )NZpydevdReasonTr   ZprocessReplaced)r#   r8   r   r\   r:   rc   rJ   r   r   r   Úexited_eventU  s
   ÿzServer.exited_eventc                 C  rL   r   rM   rJ   r   r   r   rN   b  s   zServer.terminated_eventc                 C  sZ   t �! d| _| j| j_t| jƒ | j_| jj_d | j_W d   ƒ d S 1 s&w   Y  d S )NF)	r*   Úis_connectedr8   r   Úhandlersr#   r)   r<   r   r   r   r   r   Údetach_from_sessiong  s   

"üzServer.detach_from_sessionc                   sž   ˆ j jr,t dˆ ¡ ˆ j‰ˆjrˆjjs tˆ‡ fdd„dd� nˆ j‡ ‡fdd„dd� t	� t
 ˆ j ¡ t ¡  W d   ƒ n1 sCw   Y  tƒ  ¡  d S )Nz*{0} is waiting for replacement subprocess.c                   s   | j ˆ j kS r   r@   )r   r   r   r   Ú<lambda>v  s    z#Server.disconnect.<locals>.<lambda>é<   )Útimeoutc                     s,   ˆj  pˆj j pt‡ fdd„ˆj jD ƒƒS )Nc                 3  s   � | ]	}|j ˆ j kV  qd S r   r@   r   r   r   r   r   }  s
   € 
ÿ
ÿz6Server.disconnect.<locals>.<lambda>.<locals>.<genexpr>)r:   ri   r+   Zknown_subprocessesr   rR   r   r   rl   z  s   ÿþ)r8   r   r   r7   rS   r:   ri   Úwait_for_connectionÚwait_forr*   r,   rP   r0   r1   r[   r!   r   r]   rR   r   r!   n  s    ÿ÷
þzServer.disconnect)rK   rg   )rU   rV   rW   rX   r   Ú	ComponentZmessage_handlerrY   rZ   r=   Úpropertyr   r   r   r&   rK   rd   re   rf   rh   rN   rk   r!   Ú__classcell__r   r   r]   r   r>   Ö   s6   
  







r>   ú	127.0.0.1c                 C  s    t  dt| |¡at ¡  t ¡ S )Nr>   )r   Úserver
   Úlistenerr	   Úreport_socketsÚgetsockname)ÚhostÚportr   r   r   ru   Š  s   ru   c                   C  s   t d uS r   )rv   r   r   r   r   Ú
is_serving‘  s   r{   c                   C  sD   zt d urt  ¡  d a W n ty   tjdd� Y nw t ¡  d S )NÚwarning)Úlevel)rv   r4   r2   r   r3   r	   rw   r   r   r   r   Ústop_serving•  s   €ÿr~   c                   C  s0   t � ttƒW  d   ƒ S 1 sw   Y  d S r   )r*   Úlistr,   r   r   r   r   Úconnections   s   $ÿr€   c                   sÀ   ‡‡fdd„‰ˆdkˆ_ ˆrtjˆdd�}d|_| ¡  ˆdkr&t d| ¡ 	 t�* t 	¡  ‡ fdd	„t
D ƒ}t|d
ƒ}|d
usCˆj rL|W  d
  ƒ S W d
  ƒ n1 sVw   Y  t ¡  q')zìWaits 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                     sB   t  ˆ ¡ dˆ_t� t ¡  W d   ƒ d S 1 sw   Y  d S rO   )ÚtimeÚsleepÚ	timed_outr*   r0   r1   r   )rn   Úwait_for_timeoutr   r   r„   ­  s
   

"ÿz-wait_for_connection.<locals>.wait_for_timeoutr   z%servers.wait_for_connection() timeout)Útargetr)   Tz/{0} waiting for connection from debug server...c                 3  s   � | ]	}ˆ |ƒr|V  qd S r   r   r   )Ú	predicater   r   r   À  s   € z&wait_for_connection.<locals>.<genexpr>N)rƒ   Ú	threadingÚThreadÚdaemonr$   r   r7   r*   r0   Úclearr,   ÚnextÚwait)rS   r†   rn   ÚthreadZconnsr   r   )r†   rn   r„   r   ro   ¥  s,   
ÿ
ûüùro   c                   C  sR   	 t  ¡  t� t  ¡  ttƒs	 W d  ƒ dS W d  ƒ n1 s#w   Y  q)zÁBlocks 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.
    TN)r0   rŒ   r*   rŠ   r.   r,   r   r   r   r   Úwait_until_disconnectedÇ  s   ýþþrŽ   c                   C  s2   t � t ¡  W d  ƒ dS 1 sw   Y  dS )zlUnblocks any pending wait_until_disconnected() call that is waiting on the
    first server to connect.
    N)r*   r0   r1   r   r   r   r   r5   Õ  s   
"ÿr5   c           	   
     s:  t  ¡ \}}tjtj tj¡d|d t	|ƒ g}t
jd ur$|dt
jg7 }||7 }|dt	ˆƒg7 }t d|¡ ztj|dtjtjtjd�‰ W n ty` } zt dˆ¡ t d	 ˆ|¡¡‚d }~ww g ‰ˆ d
 ˆ¡¡ ‡‡‡fdd„}tj|dˆ› d�ˆ jfdd� ¡  ‡ ‡‡‡fdd„}tj|dˆ› d�dd� ¡  d S )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                   s„   z&	 |   ¡ }|s	n| dd¡}ˆ |¡ t dˆ| ¡ ¡ qt dˆ¡ W d S  tyA   t ¡ }t	j
|d� ˆ d| ¡ ƒ Y d S w )NTzutf-8ÚreplacezInjector[PID={0}] output: {1}zInjector[PID={0}] exited.)Úfiler“   )ÚreadlineÚdecoder/   r   r7   Úrstripr2   ÚioÚStringIOÚ	tracebackÚ	print_excÚgetvalue)r<   ÚlineÚs)Ú	on_outputÚoutput_collectedr   r   r   Úcapture  s   
úýzinject.<locals>.capturezInjector[PID=z] stdoutT)r…   r)   Úargsr‰   c                    s"  d} t   ¡ }	 t  d¡ ˆ  ¡ }|d ur0|dkr.ˆddƒ ˆ}g ‰d |¡}ˆdd |¡ƒ d S t   ¡ | }ˆdd	ˆ|f ƒ | s~|d
kr~d} tjdv r~ˆddƒ ˆddƒ ˆddƒ ˆddƒ ˆddƒ ˆddƒ ˆddƒ ˆddƒ ˆddƒ ˆddƒ | r�ˆ}g ‰d |¡}|r�ˆd|ƒ q)NFTé   r   r“   zAttach to PID failed.

Ú r’   z'Attaching to PID: %s (elapsed: %.2fs).
é
   )ÚlinuxZ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)Ztaking_longer_than_expectedZinitial_timeÚ
returncodeÚoldÚcontentsÚelapsed©Zinjectorr    r¡   r   r   r   Úinfo_on_timeout  sŽ   
þ
ÿ
þþþþþþþþþþ

¸zinject.<locals>.info_on_timeoutz] info on timeout)r…   r)   r‰   )rv   rx   rª   Ú
executableÚosÚpathÚdirnamer   Ú__file__r#   r   rB   r   r7   Ú
subprocessÚPopenÚPIPEÚSTDOUTr2   r3   r   ZMessageHandlingErrorÚformatr/   r‡   rˆ   r’   r$   )	r   Zdebugpy_argsr    ry   rz   ZcmdlineÚexcr¢   r±   r   r°   r   ÚinjectÝ  sZ   ü

ûÿÿÿ€ü
üNÿ
r½   )rt   r   r   )&Ú
__future__r   r³   r·   rª   r‡   r�   r   r   Zdebugpy.commonr   r   r   r   r"   r   r	   r›   r™   rB   rv   ÚRLockr*   r,   ÚEventr0   r'   r
   rq   r>   ru   r{   r~   r€   ro   rŽ   r5   r½   r   r   r   r   Ú<module>   s@    4 
5
"