| # Useful gdb string convenience functions. |
| # Copyright (C) 2012-2013 Free Software Foundation, Inc. |
| |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| """$_memeq, $_strlen, $_streq, $_regex""" |
| |
| import gdb |
| import re |
| |
| |
| class _MemEq(gdb.Function): |
| """$_memeq - compare bytes of memory |
| |
| Usage: |
| $_memeq(a, b, len) |
| |
| Returns: |
| True if len bytes at a and b compare equally. |
| """ |
| def __init__(self): |
| super(_MemEq, self).__init__("_memeq") |
| |
| def invoke(self, a, b, length): |
| if length < 0: |
| raise ValueError("length must be non-negative") |
| if length == 0: |
| return True |
| # The argument(s) to vector are [low_bound,]high_bound. |
| byte_vector = gdb.lookup_type("char").vector(length - 1) |
| ptr_byte_vector = byte_vector.pointer() |
| a_ptr = a.reinterpret_cast(ptr_byte_vector) |
| b_ptr = b.reinterpret_cast(ptr_byte_vector) |
| return a_ptr.dereference() == b_ptr.dereference() |
| |
| |
| class _StrLen(gdb.Function): |
| """$_strlen - compute string length |
| |
| Usage: |
| $_strlen(a) |
| |
| Returns: |
| Length of string a, assumed to be a string in the current language. |
| """ |
| def __init__(self): |
| super(_StrLen, self).__init__("_strlen") |
| |
| def invoke(self, a): |
| s = a.string() |
| return len(s) |
| |
| |
| class _StrEq(gdb.Function): |
| """$_streq - check string equality |
| |
| Usage: |
| $_streq(a, b) |
| |
| Returns: |
| True if a and b are identical strings in the current language. |
| |
| Example (amd64-linux): |
| catch syscall open |
| cond $bpnum $_streq((char*) $rdi, "foo") |
| """ |
| def __init__(self): |
| super(_StrEq, self).__init__("_streq") |
| |
| def invoke(self, a, b): |
| return a.string() == b.string() |
| |
| |
| class _RegEx(gdb.Function): |
| """$_regex - check if a string matches a regular expression |
| |
| Usage: |
| $_regex(string, regex) |
| |
| Returns: |
| True if string str (in the current language) matches the |
| regular expression regex. |
| """ |
| def __init__(self): |
| super(_RegEx, self).__init__("_regex") |
| |
| def invoke(self, string, regex): |
| s = string.string() |
| r = re.compile(regex.string()) |
| return bool(r.match(s)) |
| |
| |
| # GDB will import us automagically via gdb/__init__.py. |
| _MemEq() |
| _StrLen() |
| _StrEq() |
| _RegEx() |