diff --git a/assets/debugging/jsix.elf-gdb.py b/assets/debugging/jsix.elf-gdb.py index d54a537..c883396 100644 --- a/assets/debugging/jsix.elf-gdb.py +++ b/assets/debugging/jsix.elf-gdb.py @@ -2,7 +2,7 @@ import gdb class PrintStackCommand(gdb.Command): def __init__(self): - super().__init__("popc_stack", gdb.COMMAND_DATA) + super().__init__("j6stack", gdb.COMMAND_DATA) def invoke(self, arg, from_tty): args = gdb.string_to_argv(arg) @@ -22,7 +22,38 @@ class PrintStackCommand(gdb.Command): print("{:016x} (+{:04x}): {:016x}".format(int(base_addr) + offset, offset, int(value))) +class PrintBacktraceCommand(gdb.Command): + def __init__(self): + super().__init__("j6bt", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + args = gdb.string_to_argv(arg) + + frame = "$rbp" + if len(args) > 0: + frame = args[0] + + depth = 30 + if len(args) > 1: + depth = int(args[1]) + + for i in range(depth-1, -1, -1): + ret = gdb.parse_and_eval(f"*(uint64_t*)({frame} + 8)") + frame = gdb.parse_and_eval(f"*(uint64_t*)({frame})") + + name = "" + block = gdb.block_for_pc(int(ret)) + if block: + name = block.function or "" + + print("{:016x} {}".format(int(ret), name)) + + if frame == 0 or ret == 0: + return + + PrintStackCommand() +PrintBacktraceCommand() gdb.execute("target remote :1234") gdb.execute("display/i $rip")