aboutsummaryrefslogtreecommitdiffstats
path: root/misc/gdb.py
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-08-03 09:55:36 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2023-08-03 09:55:37 -0700
commitb35a2223486c80e496c0c678c1e3950be5086320 (patch)
treeada42a35daf532e54880540fa52031d342494fbf /misc/gdb.py
parentc65856d44f91cbcf8fd8172c609b96f936938070 (diff)
downloadruby-b35a2223486c80e496c0c678c1e3950be5086320.tar.gz
gdb.py: Support dumping a dummy frame [ci skip]
Diffstat (limited to 'misc/gdb.py')
-rw-r--r--misc/gdb.py23
1 files changed, 13 insertions, 10 deletions
diff --git a/misc/gdb.py b/misc/gdb.py
index 74f97cdbdc..8f22bc91e1 100644
--- a/misc/gdb.py
+++ b/misc/gdb.py
@@ -56,16 +56,17 @@ class CFP(gdb.Command):
except SystemExit:
return
cfp = f'(ruby_current_ec->cfp + ({args.uplevel}))'
+ end_cfp = self.get_int('ruby_current_ec->vm_stack + ruby_current_ec->vm_stack_size')
+ cfp_index = int((end_cfp - self.get_int(cfp) - 1) / self.get_int('sizeof(rb_control_frame_t)'))
if args.all:
- 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)')) - 1 # exclude dummy CFP
for i in range(cfp_count):
print('-' * 80)
self.invoke(str(cfp_count - i - 1), from_tty)
return
- print('CFP (addr=0x{:x}, uplevel={}):'.format(self.get_int(cfp), args.uplevel))
+ print('CFP (addr=0x{:x}, index={}):'.format(self.get_int(cfp), cfp_index))
gdb.execute(f'p *({cfp})')
print()
@@ -91,14 +92,16 @@ class CFP(gdb.Command):
self.print_env(cfp, -1, self.frame_types(cfp, -1))
print()
- if args.stack_size is not None:
- stack_size = args.stack_size
- else:
- stack_size = int((self.get_int(f'{cfp}->sp') - self.get_int(f'vm_base_ptr({cfp})')) / 8)
- print(f'Stack (size={stack_size}):')
- for i in range(0, stack_size):
- self.print_stack(cfp, i, self.rp(cfp, i))
- print(self.regs(cfp, stack_size))
+ # We can't calculate BP for the first frame
+ if cfp_index > 0:
+ if args.stack_size is not None:
+ stack_size = args.stack_size
+ else:
+ stack_size = int((self.get_int(f'{cfp}->sp') - self.get_int(f'vm_base_ptr({cfp})')) / 8)
+ print(f'Stack (size={stack_size}):')
+ for i in range(0, stack_size):
+ self.print_stack(cfp, i, self.rp(cfp, i))
+ print(self.regs(cfp, stack_size))
def print_env(self, cfp, bp_index, content):
ep_index = bp_index + 1