summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-07-20 15:02:48 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2023-07-20 15:04:51 -0700
commit8d9a25a6d799c50514213b0d15250d9c260213d1 (patch)
tree2dfe0e74a3ba91f8680cbb3f3a122beddf7446ba /misc
parent210caa777b2ee2405b1d074b790b0183e0f6b27f (diff)
misc/gdb.py: Allow overriding stack_size [ci skip]
Diffstat (limited to 'misc')
-rw-r--r--misc/gdb.py34
1 files changed, 26 insertions, 8 deletions
diff --git a/misc/gdb.py b/misc/gdb.py
index 96d7c3cafb..0a1b20008c 100644
--- a/misc/gdb.py
+++ b/misc/gdb.py
@@ -1,8 +1,17 @@
+import argparse
import textwrap
-# Usage:
-# cfp: Dump the current cfp
-# cfp 1: Dump the caller cfp
+# usage: [-h] [-s STACK_SIZE] [uplevel]
+#
+# Dump a control frame
+#
+# positional arguments:
+# uplevel CFP offset from the stack top
+#
+# options:
+# -h, --help show this help message and exit
+# -s STACK_SIZE, --stack-size STACK_SIZE
+# override stack_size (useful for JIT frames)
class CFP(gdb.Command):
FRAME_MAGICS = [
# frame types
@@ -35,10 +44,16 @@ 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}))'
+ self.parser = argparse.ArgumentParser(description='Dump a control frame')
+ self.parser.add_argument('uplevel', type=int, nargs='?', default=0, help='CFP offset from the stack top')
+ self.parser.add_argument('-s', '--stack-size', type=int, help='override stack_size (useful for JIT frames)')
+
+ def invoke(self, args, from_tty):
+ try:
+ args = self.parser.parse_args(args.split())
+ 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_count = int((end_cfp - self.get_int('ruby_current_ec->cfp')) / self.get_int('sizeof(rb_control_frame_t)'))
@@ -65,7 +80,10 @@ class CFP(gdb.Command):
self.print_stack(cfp, -1, self.frame_types(cfp, -1))
print()
- stack_size = int((self.get_int(f'{cfp}->sp') - self.get_int(f'vm_base_ptr({cfp})')) / 8)
+ 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))