1
+ import argparse
1
2
import textwrap
2
3
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)
6
15
class CFP (gdb .Command ):
7
16
FRAME_MAGICS = [
8
17
# frame types
@@ -35,10 +44,16 @@ class CFP(gdb.Command):
35
44
def __init__ (self ):
36
45
super (CFP , self ).__init__ ('cfp' , gdb .COMMAND_USER )
37
46
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 } ))'
42
57
43
58
end_cfp = self .get_int ('ruby_current_ec->vm_stack + ruby_current_ec->vm_stack_size' )
44
59
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):
65
80
self .print_stack (cfp , - 1 , self .frame_types (cfp , - 1 ))
66
81
print ()
67
82
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 )
69
87
print (f'Stack (size={ stack_size } ):' )
70
88
for i in range (0 , stack_size ):
71
89
self .print_stack (cfp , i , self .rp (cfp , i ))
0 commit comments