???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
:)g5$                 @   s   d dl mZ d dlZd dlZddlmZmZmZm	Z	m
Z
mZ G dd deZG dd deZG d	d
 d
eZG dd deZG dd deZdS )    )print_functionN   )lib_USDT_CB_USDT_PROBE_CBbcc_usdt_locationbcc_usdt_argumentBCC_USDT_ARGUMENT_FLAGSc               @   s   e Zd ZdS )USDTExceptionN)__name__
__module____qualname__ r   r   /usr/lib/python3.6/usdt.pyr
      s   r
   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
USDTProbeArgumentc             C   s   |j dk | _t|j | _ |j| _| jtj@ dkr8|j| _| jtj@ dkrP|j| _| jtj	@ dkrh|j
| _
| jtj@ dkr|j| _| jtj@ dkr|j| _| jtj@ dkr|j| _d S )Nr   )sizesignedabsvalidr	   CONSTANTconstantDEREF_OFFSETderef_offsetDEREF_IDENTderef_identBASE_REGISTER_NAMEbase_register_nameINDEX_REGISTER_NAMEindex_register_nameSCALEscale)selfZargumentr   r   r   __init__   s    zUSDTProbeArgument.__init__c             C   s   d| j | jrdndf S )Nz%d %s byteszsigned  Zunsigned)r   r   )r!   r   r   r   _size_prefix+   s    zUSDTProbeArgument._size_prefixc             C   sB  | j tj@ dkrd| j S | j tj@ dkr8d| jj  S | j tj@ dkr| j tj@ dkr| j tj@ dkrd| j	j  }| j tj
@ dkr|d| j 7 }nd}| jdkrdnd}d	| jj |t| j|f S | j tj@ dkr8| j tj@ dkr8| j tj@ dkr8| jd
kr8| jdkrdnd}d| jj |t| jf S d| j  S )Nr   z%dz%sz + %sz * %d +-z*(%s %s %d%s)Zipz*(&%s %s %d)z&unrecognized argument format, flags %d)r   r	   r   r   r   r   decoder   r   r   r   r    r   r   r   r   )r!   Zindex_offsetZsignr   r   r   _format/   s,    


zUSDTProbeArgument._formatc             C   s   d| j  | j f S )Nz%s @ %s)r#   r(   )r!   r   r   r   __str__M   s    zUSDTProbeArgument.__str__N)r   r   r   r"   r#   r(   r)   r   r   r   r   r      s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )USDTProbeLocationc             C   s(   || _ || _|j| _|j| _|j| _d S )N)probeindexnum_argumentsaddressbin_path)r!   r+   r,   locationr   r   r   r"   Q   s
    zUSDTProbeLocation.__init__c             C   s   d| j j | jf S )Nz%s 0x%x)r/   r'   r.   )r!   r   r   r   r)   X   s    zUSDTProbeLocation.__str__c             C   sP   t  }tj| jj| jj| jj| j|tj	|}|dkrHt
d|| jf t|S )Nr   z.error retrieving probe argument %d location %d)r   r   Zbcc_usdt_get_argumentr+   contextprovidernamer,   ctbyrefr
   r   )r!   r,   argresr   r   r   get_argument[   s    zUSDTProbeLocation.get_argumentN)r   r   r   r"   r)   r8   r   r   r   r   r*   P   s   r*   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	USDTProbec             C   s:   || _ |j| _|j| _|j| _|j| _|j| _|j| _d S )N)r1   r2   r3   r/   	semaphoreZnum_locationsr-   )r!   r1   r+   r   r   r   r"   g   s    zUSDTProbe.__init__c             C   s   d| j j | jj | jf S )Nz%s:%s [sema 0x%x])r2   r'   r3   r:   )r!   r   r   r   r)   p   s    zUSDTProbe.__str__c             C   s   d| j j | jj f S )Nz%s:%s)r2   r'   r3   )r!   r   r   r   
short_namet   s    zUSDTProbe.short_namec             C   sD   t  }tj| j| j| j|tj|}|dkr8td| t	| ||S )Nr   z"error retrieving probe location %d)
r   r   Zbcc_usdt_get_locationr1   r2   r3   r4   r5   r
   r*   )r!   r,   locr7   r   r   r   get_locationw   s    zUSDTProbe.get_locationN)r   r   r   r"   r)   r;   r=   r   r   r   r   r9   f   s   	r9   c               @   s^   e Zd Z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d Zdd ZdS )USDTNc             C   s   |rX|dkrX|| _ |r,tj||jd| _ntj|tjd| _| jd krtd| n<|r|| _tj	|jd| _| jd krtd| ntdd S )Nr   asciir   z USDT failed to instrument PID %dz!USDT failed to instrument path %sz/either a pid or a binary path must be specified)
pidr   Zbcc_usdt_new_frompidencoder1   r4   Zc_char_pr
   pathZbcc_usdt_new_frompath)r!   rA   rC   r   r   r   r"      s    

zUSDT.__init__c             C   s   t j| j d S )N)r   Zbcc_usdt_closer1   )r!   r   r   r   __del__   s    zUSDT.__del__c             C   sz   |j dd}t|dkr6tj| j|jd|jd}n,|\}}tj| j|jd|jd|jd}|dkrvtd| d S )N:r   r?   r   a.  Failed to enable USDT probe '%s':
the specified pid might not contain the given language's runtime,
or the runtime was not built with the required USDT probes. Look
for a configure flag similar to --with-dtrace or --enable-dtrace.
To check which probes are present in the process, use the tplist tool.
)splitlenr   Zbcc_usdt_enable_prober1   rB   Z%bcc_usdt_enable_fully_specified_prober
   )r!   r+   fn_nameprobe_partsretprovider_name
probe_namer   r   r   enable_probe   s    zUSDT.enable_probec             C   sP   y| j || W n: tk
rJ } zt|tjd tjd W Y d d }~X nX d S )N)filer   )rM   r
   printsysstderrexit)r!   r+   rH   er   r   r   enable_probe_or_bail   s
    zUSDT.enable_probe_or_bailc             C   s   | j S )N)r1   )r!   r   r   r   get_context   s    zUSDT.get_contextc             C   s,   t jd  }t j| j|d< tj|dj S )Nr   r   )r4   Zc_void_pr1   r   Zbcc_usdt_genargsr'   )r!   Z	ctx_arrayr   r   r   get_text   s    zUSDT.get_textc             C   s`   |j dd}t|dkr2tj| j|jd|j S |\}}tj| j|jd|jd|j S d S )NrE   r   r?   )rF   rG   r   Zbcc_usdt_get_probe_argctyper1   rB   r'   Z+bcc_usdt_get_fully_specified_probe_argctype)r!   rL   Z	arg_indexrI   rK   r+   r   r   r   get_probe_arg_ctype   s    zUSDT.get_probe_arg_ctypec                s(   g   fdd}t jjt|  S )Nc                s    j tj| j d S )N)appendr9   r1   contents)r+   )probesr!   r   r   
_add_probe   s    z)USDT.enumerate_probes.<locals>._add_probe)r   Zbcc_usdt_foreachr1   r   )r!   r[   r   )rZ   r!   r   enumerate_probes   s    zUSDT.enumerate_probesc             C   sD   | j  }x6|D ].\}}}}|r"d}|j|j |j ||d qW d S )Nr   )r3   rH   addrrA   r@   )enumerate_active_probesZattach_uprober'   )r!   ZbpfZattach_usdt_ignore_pidrZ   binpathrH   r]   rA   r   r   r   attach_uprobes   s    zUSDT.attach_uprobesc                s&   g   fdd}t j| jt|  S )Nc                s    j | |||f d S )N)rX   )r_   rH   r]   rA   )rZ   r   r   r[      s    z0USDT.enumerate_active_probes.<locals>._add_probe)r   Zbcc_usdt_foreach_uprober1   r   )r!   r[   r   )rZ   r   r^      s    zUSDT.enumerate_active_probes)NN)r   r   r   r"   rD   rM   rT   rU   rV   rW   r\   r`   r^   r   r   r   r   r>      s   


r>   )Z
__future__r   Zctypesr4   rP   Zlibbccr   r   r   r   r   r	   	Exceptionr
   objectr   r*   r9   r>   r   r   r   r   <module>   s    7