Skip to content

Commit 8d9a25a

Browse files
committed
misc/gdb.py: Allow overriding stack_size [ci skip]
1 parent 210caa7 commit 8d9a25a

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

misc/gdb.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1+
import argparse
12
import textwrap
23

3-
# Usage:
4-
# cfp: Dump the current cfp
5-
# cfp 1: Dump the caller cfp
4+
# usage: [-h] [-s STACK_SIZE] [uplevel]
5+
#
6+
# Dump a control frame
7+
#
8+
# positional arguments:
9+
# uplevel CFP offset from the stack top
10+
#
11+
# options:
12+
# -h, --help show this help message and exit
13+
# -s STACK_SIZE, --stack-size STACK_SIZE
14+
# override stack_size (useful for JIT frames)
615
class CFP(gdb.Command):
716
FRAME_MAGICS = [
817
# frame types
@@ -35,10 +44,16 @@ class CFP(gdb.Command):
3544
def __init__(self):
3645
super(CFP, self).__init__('cfp', gdb.COMMAND_USER)
3746

38-
def invoke(self, offset, from_tty):
39-
if not offset:
40-
offset = '0'
41-
cfp = f'(ruby_current_ec->cfp + ({offset}))'
47+
self.parser = argparse.ArgumentParser(description='Dump a control frame')
48+
self.parser.add_argument('uplevel', type=int, nargs='?', default=0, help='CFP offset from the stack top')
49+
self.parser.add_argument('-s', '--stack-size', type=int, help='override stack_size (useful for JIT frames)')
50+
51+
def invoke(self, args, from_tty):
52+
try:
53+
args = self.parser.parse_args(args.split())
54+
except SystemExit:
55+
return
56+
cfp = f'(ruby_current_ec->cfp + ({args.uplevel}))'
4257

4358
end_cfp = self.get_int('ruby_current_ec->vm_stack + ruby_current_ec->vm_stack_size')
4459
cfp_count = int((end_cfp - self.get_int('ruby_current_ec->cfp')) / self.get_int('sizeof(rb_control_frame_t)'))
@@ -65,7 +80,10 @@ def invoke(self, offset, from_tty):
6580
self.print_stack(cfp, -1, self.frame_types(cfp, -1))
6681
print()
6782

68-
stack_size = int((self.get_int(f'{cfp}->sp') - self.get_int(f'vm_base_ptr({cfp})')) / 8)
83+
if args.stack_size is not None:
84+
stack_size = args.stack_size
85+
else:
86+
stack_size = int((self.get_int(f'{cfp}->sp') - self.get_int(f'vm_base_ptr({cfp})')) / 8)
6987
print(f'Stack (size={stack_size}):')
7088
for i in range(0, stack_size):
7189
self.print_stack(cfp, i, self.rp(cfp, i))

0 commit comments

Comments
 (0)