| 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) |