summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gdbinit2
-rw-r--r--misc/gdb.py33
2 files changed, 35 insertions, 0 deletions
diff --git a/.gdbinit b/.gdbinit
index 074eeef4f1..5980c7f81c 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -1348,3 +1348,5 @@ define print_flags
printf "RUBY_FL_USER17 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER17 ? "1" : "0"
printf "RUBY_FL_USER18 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER18 ? "1" : "0"
end
+
+source misc/gdb.py
diff --git a/misc/gdb.py b/misc/gdb.py
new file mode 100644
index 0000000000..038ebfc069
--- /dev/null
+++ b/misc/gdb.py
@@ -0,0 +1,33 @@
+# Usage:
+# cfp: Dump the current cfp
+# cfp + 1: Dump the caller cfp
+class CFP(gdb.Command):
+ def __init__(self):
+ super(CFP, self).__init__('cfp', gdb.COMMAND_USER)
+
+ def invoke(self, offset, from_tty):
+ if not offset:
+ offset = '0'
+ cfp = f'(ruby_current_ec->cfp + ({offset}))'
+
+ end_cfp = self.get_int('ruby_current_ec->vm_stack + ruby_current_ec->vm_stack_size')
+ cfp_count = int((end_cfp - self.get_int('ruby_current_ec->cfp')) / self.get_int('sizeof(rb_control_frame_t)'))
+
+ print('CFP (count={}, addr=0x{:x}):'.format(cfp_count, self.get_int(cfp)))
+ gdb.execute(f'p *({cfp})')
+ print()
+
+ stack_size = int((self.get_int(f'{cfp}->sp') - self.get_int(f'{cfp}->__bp__')) / 8)
+ print(f'Stack (size={stack_size}):')
+ for i in range(0, stack_size):
+ obj = self.get_int(f'{cfp}->__bp__[{i}]')
+ rp = self.get_string(f'rp {obj}')
+ print(f'[{i}] {rp}', end='')
+
+ def get_int(self, expr):
+ return int(self.get_string(f'printf "%ld", ({expr})'))
+
+ def get_string(self, expr):
+ return gdb.execute(expr, to_string=True)
+
+CFP()