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
19import gdb
20import re
21
22
23class _MemEq(gdb.Function):
24  """$_memeq - compare bytes of memory
25
26Usage:
27  $_memeq(a, b, len)
28
29Returns:
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
48class _StrLen(gdb.Function):
49  """$_strlen - compute string length
50
51Usage:
52  $_strlen(a)
53
54Returns:
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
65class _StrEq(gdb.Function):
66  """$_streq - check string equality
67
68Usage:
69  $_streq(a, b)
70
71Returns:
72  True if a and b are identical strings in the current language.
73
74Example (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
85class _RegEx(gdb.Function):
86  """$_regex - check if a string matches a regular expression
87
88Usage:
89  $_regex(string, regex)
90
91Returns:
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