ó
ˆ5„Oc           @   s@  d  d l  Z  d  d l Z d  d l Z d e f d „  ƒ  YZ d „  Z e d k r<e e  j ƒ d k pz e  j d d d	 g k r§ d
 GHd GHd e  j d GHe  j	 d ƒ n  e e
 e  j d ƒ j ƒ  e
 e  j d ƒ j ƒ  e
 e  j d ƒ j ƒ  ƒ Z e j ƒ  \ Z Z Z d e e f GHd Z e r,d Z n  e  j	 e ƒ n  d S(   iÿÿÿÿNt	   ParseSegvc           B   s\   e  Z e d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z RS(	   c         C   s¼   | r t  j d t  j ƒ n  |  j | ƒ |  _ d  |  _ x6 d d g D]( } | |  j k rD |  j | |  _ qD qD W|  j | ƒ \ |  _ |  _	 |  _
 |  _ |  _ d  |  _ |  j | ƒ |  _ d  S(   Nt   levelt   rspt   esp(   t   loggingt   basicConfigt   DEBUGt
   parse_regst   regst   Nonet   spt   parse_disassemblyt   linet   pct   insnt   srct   destt	   stack_vmat
   parse_mapst   maps(   t   selft	   registerst   disassemblyR   t   debugt   reg(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   __init__   s    	-	c         C   s<   x5 |  j  D]* } | | d k r
 | | d k  r
 | Sq
 Wd  S(   Nt   startt   end(   R   R	   (   R   t   addrt   vma(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   find_vma"   s     c         C   s#  g  } x| j  ƒ  D]} | j ƒ  j ƒ  } y | d d !\ } } } } Wn t d | j ƒ  ƒ ‚ n Xt | ƒ d k rƒ d  }	 n
 | d }	 g  | j d ƒ D] }
 t |
 d ƒ ^ q \ } } |	 d k rÜ t | ƒ |  _ n  | j i | d 6| d	 6| d
 6|	 d 6ƒ t	 j
 | | | |	 ƒ q W| S(   Ni    i   s   Cannot parse maps line: %si   t   -i   s   [stack]R   R   t   permst   name(   t
   splitlinest   stript   splitt
   ValueErrort   lenR	   t   intR   t   appendR   R   (   R   t   maps_strR   R   t   itemst   spanR    t   bitst   devR!   t   xR   R   (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyR   (   s     	
1)c         C   sg   t  ƒ  } xW | j ƒ  D]I } | j ƒ  d d !\ } } t | d ƒ | | <t j d | | | ƒ q W| S(   Ni    i   i   s	   %s:0x%08x(   t   dictR"   R$   R'   R   R   (   R   t   reg_strR   R   R   t   hexvalue(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyR   ;   s    	c         C   s  |  j  s t d ƒ ‚ n  | j ƒ  } t | ƒ d k rY | d j d ƒ rY | j d ƒ n  t | ƒ d k  rz t d ƒ ‚ n  | d j ƒ  } | j d ƒ r¬ | d j ƒ  } n  t j | ƒ | j	 ƒ  d } | j d ƒ r÷ t
 | j	 d	 ƒ d d
 ƒ } n t d | | f ƒ ‚ t j d | ƒ | j	 d	 d ƒ d j ƒ  } d | k sc| d k rvt | ƒ d k rv| | d  d  d  f S| d k rÌ| d j d ƒ rÌ| d | d j ƒ  } | j	 d	 d ƒ d j ƒ  } n  | j	 ƒ  } | d j d ƒ r| d j d ƒ r| j d ƒ n  d } t | ƒ d k r8| j d ƒ } n  d j | ƒ }	 t j d |	 ƒ g  }
 d  } d  } | d k r~d  }
 n¹ t j d | ƒ xH t j d | ƒ D]4 } t | j d ƒ ƒ r¡|
 j | j d ƒ ƒ q¡q¡Wt |
 ƒ d k r|
 d } t j d | ƒ n  t |
 ƒ d k r7|
 d } t j d | ƒ n  |	 d# k rzx4 d  d! g D]# } | |  j  k rPd" | } PqPqPWn  | | |	 | | f S($   Ns   Registers not loaded yet!?i    t   Dumpi   s    Failed to load empty disassemblys   =>i   t   0xt   :i   s1   Could not parse PC "%s" from disassembly line: %ss
   pc: 0x%08xs   Cannot access memory at addresst    t    iÿÿÿÿt   >t   <s   insn: %ss
   args: "%s"s   ([^,\(]*(\(:?[^\)]+\))*)s   src: %ss   dest: %st   pusht   popt   pushlt   poplt   callt   callqt   rett   retqR   R   s   (%%%s)(   R9   s   popR;   R<   s   callR>   R?   R@   (   R   R%   R"   R&   t
   startswithR:   R#   R   R   R$   R'   R	   t   endswitht   joint   ret   finditert   groupR(   (   R   R   t   linesR   t   pc_strR   t   full_insn_strt
   insn_partst   args_strR   t   argsR   R   t   mR   (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyR   C   sf    	%*&	


c      
   C   s_  i d d g d 6d d g d 6d d g d	 6} |  j  | ƒ } | d  k r— d
 } | d k  rc d } n  t d | | | | d f d | | d | f f S| | d k r8d } | d k rÛ d	 | d k rÒ d } qÛ d } n  d | | d | | d f } t d | | | | d | d | d | d | d f | f St d | | f d | | d f Sd  S(   Nt
   executablet	   executingR.   t   readablet   readingt   rt   writablet   writingt   wt   unknowni   t   NULLsA   %s (0x%08x) not located in a known VMA region (needed %s region)!i    s	   %s %s VMAi   R    R5   s	   writable s   non-writable s   %s %sVMA %sR!   s5   %s (0x%08x) in non-%s VMA region: 0x%08x-0x%08x %s %sR   R   s   %s (0x%08x) oks   %s ok(   R   R	   t   Falset   True(   R   t   permR   R!   t	   perm_nameR   t   alarmistt   short(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   validate_vmaŠ   s     -	4		>c         C   sc  | } d } | j  d ƒ r( | d } n  | |  j k rB |  j | St | ƒ d k r~ | j d ƒ r~ | d O} d | d } n  | |  j k r |  j | | @St | ƒ d k rÕ | j d ƒ rÕ | d	 O} d
 | } n  | |  j k rô |  j | | @St | ƒ d k r0| j  d ƒ r0| d O} d | d } n  | |  j k rO|  j | | @St d | ƒ ‚ d  S(   Ni    t   %i   i   t   li ÿ  s   %sxR.   I  ÿÿ    s   e%si   t   el       üÿ s   r%ss   Could not resolve register '%s'(   RA   R   R&   RB   R%   (   R   R   t   reg_origt   mask(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   register_valueŸ   s,    !
!
!
c         C   sF  d } | j  d ƒ rU d | k rU | j d d ƒ } |  j | d d } | d } n  | j d ƒ } | d } d } | j  d ƒ r– d } | d } n  | j  d ƒ r² | d } n  t | ƒ d k r'| j  d ƒ rç |  j | d } q-| j  d	 ƒ st d
 | d ƒ ‚ n  t | d d ƒ | } n d } d d „ } d } t | ƒ d k r| d d d !}	 |	 j d ƒ }
 d } t |
 ƒ d k r¢| |  |
 d | ƒ } n  d } t |
 ƒ d k rÓ| |  |
 d | ƒ } n  d } t |
 ƒ d k r| |  |
 d | ƒ } n  | | | } n  | | | } d |  j k r:| d S| d Sd  S(   Ni    R_   R4   i   t   (R   iÿÿÿÿt   *R3   s   Unknown offset literal: %si   i   c         S   sH   | j  d ƒ r# |  j | d } n! | d k r8 d } n t | ƒ } | S(   NR_   i   R5   i    (   RA   R   R'   (   R   t   textt   val(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   _reg_valâ   s    	t   ,R   I       l            (   RA   R$   R   R&   R%   R'   (   R   t   argt   segmentt   partst   offsett   signt   addRi   t   valuet   parenst   reg_listt   baset   indext   scale(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   calculate_argÄ   sN    

c   	   
   C   sª  t  } g  } d |  j g } |  j d |  j d ƒ \ } } } | j | ƒ | sf | j | ƒ t } n  |  j d! k rŒ | j d |  j ƒ n]|  j rDd |  j k rá |  j d d" k rá |  j j d ƒ rá | j d |  j ƒ qD|  j	 |  j ƒ } |  j d | d |  j ƒ \ } } } | j | ƒ | sD| j | ƒ t } qDn  |  j
 réd |  j
 k r†|  j
 d d# k r†| j d |  j
 ƒ qé|  j	 |  j
 ƒ } |  j d | d |  j
 ƒ \ } } } | j | ƒ | sé| j | ƒ t } qén  |  j d$ k rB| rB| j d |  j |  j ƒ ƒ | j d |  j |  j ƒ ƒ t } n  |  j d  k r|  j d  k r½|  j |  j |  j d k  r| j d ƒ n  |  j |  j |  j d k r½| j d ƒ q½n  | s|  j d |  j d ƒ \ } } } | j | ƒ | s| j | ƒ t } qqn  | s‹|  j |  j ƒ } | rn| d d k sQ| d d k rn| j d ƒ | j d ƒ q‹| j d ƒ | j d ƒ n  | d  j | ƒ d  j | ƒ f S(%   Ns   Segfault happened at: %sR.   t   PCt   leat   leals   insn (%s) does not access VMAR4   i    R_   t   $Rf   s   *%s   source "%s" okRR   s   source "%s"s   destination "%s" okRU   s   destination "%s"t   outt   ins(   disallowed I/O port operation on port %dR   s/   Stack memory exhausted (SP below stack segment)R   s&   Stack pointer not within stack segmentt   SPR!   s   [vdso]s
   [vsyscall]sS   Reason could not be automatically determined. (Unhandled exception in kernel code?)s-   Reason could not be automatically determined.s   
(   Ry   Rz   (   R_   R{   Rf   (   R_   R{   Rf   (   s   outs   in(   RX   R   R^   R   R(   RY   R   R   RA   Rw   R   Rd   R
   R	   R   R   R   RC   (	   R   t
   understoodt   reasont   detailst   validR|   R]   R   R   (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   report  sh    !		5%	"%	!&(   t   __name__t
   __module__RX   R   R   R   R   R   R^   Rd   Rw   Rƒ   (    (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyR       s   				G		%	@c         C   sö   |  j  d d ƒ d k r d  Sd d d d d g } x, | D]$ } | |  k r8 d | |  d	 <d  Sq8 W|  d d k rt d  SyT t |  d |  d |  d ƒ } | j ƒ  \ } } } | r½ | |  d <n  | |  d	 <Wn' t k
 rñ } d t | ƒ |  d	 <n Xd  S(   Nt   Signalt   0t   11t   Architecturet   Disassemblyt   ProcMapst	   Registerss$   Skipped: missing required field "%s"t   SegvAnalysist   i386t   amd64t
   SegvReasons   Failure: %s(   s   i386s   amd64(   t   getR    Rƒ   t   BaseExceptiont   str(   Rƒ   t   neededt   fieldt   segvR   R€   R   Ra   (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   add_infoK  s"    t   __main__i   i   s   -hs   --helps8   To run self-test, run without any arguments (or with -v)s    To do stand-alone crash parsing:s6     Usage: %s Registers.txt Disassembly.txt ProcMaps.txti    i   i   s   %s

%s(   t   sysRD   R   t   objectR    R—   R„   R&   t   argvt   exitt   opent   readR–   Rƒ   R   R€   R   t   rc(    (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   <module>   s$   $ÿ ;	.	