1
import gdb
2
3
def _convert_args(raw_args):
4
        for raw_arg in raw_args:
5
            if isinstance(raw_arg, gdb.Value):
6
                arg = raw_arg
7
            else:
8
                arg = gdb.parse_and_eval(raw_arg)
9
            arg_t = arg.type.strip_typedefs()
10
            if arg_t.code == gdb.TYPE_CODE_INT:
11
                yield int(arg)
12
            elif arg_t.code == gdb.TYPE_CODE_PTR:
13
                yield int(str(arg), 16)
14
            else: # let's try passing it directly
15
                yield arg
16
17
18
# some magic to register commands more easily
19
class AutoCommand(gdb.Command):
20
21
    def __init__(self, command_name, method, *args, **kw):
22
        self._command_name = command_name
23
        self._method = method
24
        super(AutoCommand, self).__init__(command_name, *args, **kw)
25
26
    def invoke(self, arg_string, from_tty):
27
        raw_args = gdb.string_to_argv(arg_string)
28
        args = _convert_args(raw_args)
29
30
        return self._method(*args)
31
32
33
class AutoFunction(gdb.Function):
34
    def __init__(self, function_name, method):
35
        self._function_name = function_name
36
        self._method = method
37
        super(AutoFunction, self).__init__(function_name)
38
39
    def invoke(self, *raw_args):
40
        args = _convert_args(raw_args)
41
        return self._method(*args)