Home | History | Annotate | Download | only in function
      1 # Useful gdb string convenience functions.
      2 # Copyright (C) 2012-2013 Free Software Foundation, Inc.
      3 
      4 # This program is free software; you can redistribute it and/or modify
      5 # it under the terms of the GNU General Public License as published by
      6 # the Free Software Foundation; either version 3 of the License, or
      7 # (at your option) any later version.
      8 #
      9 # This program is distributed in the hope that it will be useful,
     10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 # GNU General Public License for more details.
     13 #
     14 # You should have received a copy of the GNU General Public License
     15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     16 
     17 """$_memeq, $_strlen, $_streq, $_regex"""
     18 
     19 import gdb
     20 import re
     21 
     22 
     23 class _MemEq(gdb.Function):
     24   """$_memeq - compare bytes of memory
     25 
     26 Usage:
     27   $_memeq(a, b, len)
     28 
     29 Returns:
     30   True if len bytes at a and b compare equally.
     31 """
     32   def __init__(self):
     33     super(_MemEq, self).__init__("_memeq")
     34 
     35   def invoke(self, a, b, length):
     36     if length < 0:
     37       raise ValueError("length must be non-negative")
     38     if length == 0:
     39       return True
     40     # The argument(s) to vector are [low_bound,]high_bound.
     41     byte_vector = gdb.lookup_type("char").vector(length - 1)
     42     ptr_byte_vector = byte_vector.pointer()
     43     a_ptr = a.reinterpret_cast(ptr_byte_vector)
     44     b_ptr = b.reinterpret_cast(ptr_byte_vector)
     45     return a_ptr.dereference() == b_ptr.dereference()
     46 
     47 
     48 class _StrLen(gdb.Function):
     49   """$_strlen - compute string length
     50 
     51 Usage:
     52   $_strlen(a)
     53 
     54 Returns:
     55   Length of string a, assumed to be a string in the current language.
     56 """
     57   def __init__(self):
     58     super(_StrLen, self).__init__("_strlen")
     59 
     60   def invoke(self, a):
     61     s = a.string()
     62     return len(s)
     63 
     64 
     65 class _StrEq(gdb.Function):
     66   """$_streq - check string equality
     67 
     68 Usage:
     69   $_streq(a, b)
     70 
     71 Returns:
     72   True if a and b are identical strings in the current language.
     73 
     74 Example (amd64-linux):
     75   catch syscall open
     76   cond $bpnum $_streq((char*) $rdi, "foo")
     77 """
     78   def __init__(self):
     79     super(_StrEq, self).__init__("_streq")
     80 
     81   def invoke(self, a, b):
     82     return a.string() == b.string()
     83 
     84 
     85 class _RegEx(gdb.Function):
     86   """$_regex - check if a string matches a regular expression
     87 
     88 Usage:
     89   $_regex(string, regex)
     90 
     91 Returns:
     92   True if string str (in the current language) matches the
     93   regular expression regex.
     94 """
     95   def __init__(self):
     96     super(_RegEx, self).__init__("_regex")
     97 
     98   def invoke(self, string, regex):
     99     s = string.string()
    100     r = re.compile(regex.string())
    101     return bool(r.match(s))
    102 
    103 
    104 # GDB will import us automagically via gdb/__init__.py.
    105 _MemEq()
    106 _StrLen()
    107 _StrEq()
    108 _RegEx()
    109