Перерыв на всех retq текущей функции
Эта команда Python ставит точку останова на каждом retq
инструкции текущей функции:
class BreakReturn(gdb.Command):
def __init__(self):
super().__init__(
'break-return',
gdb.COMMAND_RUNNING,
gdb.COMPLETE_NONE,
False
)
def invoke(self, arg, from_tty):
frame = gdb.selected_frame()
# TODO make this work if there is no debugging information, where .block() fails.
block = frame.block()
# Find the function block in case we are in an inner block.
while block:
if block.function:
break
block = block.superblock
start = block.start
end = block.end
arch = frame.architecture()
pc = gdb.selected_frame().pc()
instructions = arch.disassemble(start, end - 1)
for instruction in instructions:
if instruction['asm'].startswith('retq '):
gdb.Breakpoint('*{}'.format(instruction['addr']))
BreakReturn()
Источник его:
source gdb.py
и используйте команду как:
break-return
continue
Вы должны теперь быть в retq
.
Шаг до retq
Просто для удовольствия, другой реализации, который останавливается, когда retq
найден (менее эффективным из так как без аппаратной поддержки):
class ContinueReturn(gdb.Command):
def __init__(self):
super().__init__(
'continue-return',
gdb.COMMAND_RUNNING,
gdb.COMPLETE_NONE,
False
)
def invoke(self, arg, from_tty):
thread = gdb.inferiors()[0].threads()[0]
while thread.is_valid():
gdb.execute('ni', to_string=True)
frame = gdb.selected_frame()
arch = frame.architecture()
pc = gdb.selected_frame().pc()
instruction = arch.disassemble(pc)[0]['asm']
if instruction.startswith('retq '):
break
ContinueReturn()
Это будет игнорировать ваши другие точки останова. TODO: можно избежать?
Не уверен, что он быстрее или медленнее, чем reverse-step
.
версии, которая останавливается на данный опкод можно найти по адресу: https://stackoverflow.com/a/31249378/895245
Вы изучили rbr? – Jack