1 # Useful gdb string convenience functions. 2 # Copyright (C) 2012-2014 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