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