end
def get_local(num)
- emit "movq #{-8*(num)}(%rbp), %rax"
+ emit "movq #{-8*(num+1)}(%rbp), %rax"
emit "pushq %rax"
end
def set_local(num)
emit "popq %rax"
- emit "movq %rax, #{-8*num}(%rbp)"
+ emit "movq %rax, #{-8*(num+1)}(%rbp)"
end
def locals(count)
end
def ret
+ emit "movq %rbp, %rsp"
emit "popq %rbp"
if @nargs > 0 then
emit "ret $#{@nargs * 8}"
class history_window:
def __init__(self, tui_window):
+ self.hex = [
+ '0', '1', '2', '3' ,'4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'c', 'D', 'E', 'F' ]
self.win = tui_window
+ self.win.title = 'Stack Dump'
+ gdb.events.before_prompt.connect(lambda : self.before_prompt())
+
+ def before_prompt(self):
+ self.render()
def render(self):
- height = self.win.height
- width = self.win.width
lines = self.get_stack()
self.win.erase()
for l in lines:
- self.win.write(l)
+ self.win.write(l + "\n")
+
+ def format_byte(self,byte):
+ val = int.from_bytes(byte, byteorder="big", signed=False)
+ upper = self.hex[ int(val / 16) ]
+ lower = self.hex[ int(val & 15) ]
+ return (upper + lower)
def get_stack(self):
- return []
+ inf = gdb.selected_inferior()
+ stack_addr = gdb.selected_frame().read_register("rsp")
+ stack = []
+ for i in range(0, 16):
+ addr = stack_addr + (i * 8)
+ mem = list(inf.read_memory(addr, 8)[0:7])
+ mem.reverse()
+ lbl = '{0:02d}'.format(i)
+ val = ''.join([self.format_byte(elem) for i,elem in enumerate(mem)])
+ stack.append(lbl + ": 0x" + val)
+ return stack
def close(self):
gdb.events.before_prompt.disconnect(self._before_prompt_listener)