]>
Commit | Line | Data |
---|---|---|
a72c3253 | 1 | # Useful gdb string convenience functions. |
e2882c85 | 2 | # Copyright (C) 2012-2018 Free Software Foundation, Inc. |
a72c3253 DE |
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() |