ó
^Mmhc           @   sL  d  d l  Z  d  d l Z d  d l Z d  d l Z d e f d „  ƒ  YZ d „  Z e d k rHe e  j	 ƒ d k p† 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 r8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  | rb t  j d k rC t j d t j d t j t  j d d ƒƒ qb t j d t j d t  j ƒ n  |  j | ƒ |  _	 d  |  _ x6 d d g D]( } | |  j	 k rŠ |  j	 | |  _ qŠ qŠ W|  j | ƒ \ |  _ |  _ |  _ |  _ |  _ d  |  _ |  j | ƒ |  _ d  S(   Nt   3t   levelt   streamt   encodings   UTF-8t   rspt   esp(   t   syst   versiont   loggingt   basicConfigt   DEBUGt   iot   TextIOWrappert   stderrt
   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   s0  g  } x#| j  ƒ  D]} | j ƒ  j ƒ  } y | d d !\ } } } } Wn' t k
 rq 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 d | | | |	 ƒ q W| S(   Ni    i   s   Cannot parse maps line: %si   t   -i   s   [stack]R"   R#   t   permst   names'   start: %s, end: %s, perms: %s, name: %s(   t
   splitlinest   stript   splitt	   Exceptiont
   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,   R0   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)(   RB   RC   RD   RE   RF   RG   RH   RI   (   R   R.   R*   R/   t
   startswithRC   R+   R	   R   R,   R0   R   t   endswitht   joint   ret   finditert   groupR1   (   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   H   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	   executingR7   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(   R>   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   %sxR7   I  ÿÿ    s   e%si   t   el       üÿ s   r%ss   Could not resolve register '%s'(   RJ   R   R/   RK   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    Rh   R=   i   t   (R'   iÿÿÿÿt   *R<   s   Unknown offset literal: %si   i   c         S   sH   | j  d ƒ r# |  j | d } n! | d k r8 d } n t | ƒ } | S(   NRh   i   R>   i    (   RJ   R   R0   (   R   t   textt   val(    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   _reg_valç   s    	t   ,R   I       l            (   RJ   R,   R   R/   R.   R0   (   R   t   argt   segmentt   partst   offsett   signt   addRr   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: %sR7   t   PCt   leat   leals   insn (%s) does not access VMAR=   i    Rh   t   $Ro   s   *%s   source "%s" okR[   s   source "%s"s   destination "%s" okR^   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   
(   R‚   Rƒ   (   Rh   R„   Ro   (   Rh   R„   Ro   (   R…   R†   (   Ra   R   Rg   R   R1   Rb   R   R   RJ   R€   R   Rm   R   R   R   R   R&   RL   (	   R   t
   understoodt   reasont   detailst   validR…   Rf   R$   R%   (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   report	  sh    !		5%	"%	!&(   t   __name__t
   __module__Ra   R!   R&   R   R   R   Rg   Rm   R€   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(   R—   R˜   (   t   getR    RŒ   t   BaseExceptiont   str(   RŒ   t   neededt   fieldt   segvRˆ   R‰   RŠ   Rj   (    (    s-   /usr/share/apport/general-hooks/parse_segv.pyt   add_infoP  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(   R   RM   R	   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$   0ÿ ?	.	