Put misc/gdb.py [experimental]

This works like:

```
(gdb) cfp
CFP (count=3, addr=0x7ffff73fef50):
$1 = {pc = 0x555556bf7818, sp = 0x7ffff72ff078, iseq = 0x7ffff2603270, self = 140737344619296, ep = 0x7ffff72ff058, block_code = 0x0,
  __bp__ = 0x7ffff72ff060, jit_return = 0x555558c2b000}

Stack (size=3):
[0] FIXNUM: 1
[1] T_STRING: "" bytesize:0 (embed) encoding:1 coderange:7bit $2 = (struct RString *) 0x7ffff249ea80
[2] [PROMOTED] T_OBJECT: $3 = {flags = 21474844769, klass = 140737344040416}
$4 = {0x24, 0x24, 0x24}

(gdb) cfp + 1
CFP (count=3, addr=0x7ffff73fef90):
$5 = {pc = 0x5555567a78f8, sp = 0x7ffff72ff040, iseq = 0x7ffff26032d0, self = 140737344619296, ep = 0x7ffff72ff038, block_code = 0x0,
  __bp__ = 0x7ffff72ff040, jit_return = 0x555558c2b000}

Stack (size=0):
```
This commit is contained in:
Takashi Kokubun 2023-03-30 23:57:13 -07:00
parent f500df097f
commit 9f426491ca
2 changed files with 35 additions and 0 deletions

View File

@ -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

33
misc/gdb.py Normal file
View File

@ -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()