2015-07-13 3 views
1

Не дубликат this question, так как я работаю через интерфейс python в gdb.
This one аналогичен, но не имеет ответа.Выполнение команд в точке останова в gdb через интерфейс python

Я расширяя gdb.breakpoint в питона так, что он записывает некоторые регистры в файл, а затем переходит к адресу: в 0x4021ee, я хочу писать вещи в файл, а затем перейти к 0x4021f3

Однако , ничего в command никогда не выполняется.

import gdb 
class DebugPrintingBreakpoint(gdb.Breakpoint): 
    def __init__(self, spec, command): 
     super(DebugPrintingBreakpoint, self).__init__(spec, gdb.BP_BREAKPOINT, internal = False) 
     self.command = command 

    def stop(self): 
     with open('tracer', 'a') as f: 
      f.write(chr(gdb.parse_and_eval("$rbx")^0x71)) 
      f.close() 
     return False 



gdb.execute("start") 
DebugPrintingBreakpoint("*0x4021ee", "jump *0x4021f3") 
gdb.execute("continue") 

Если я явно добавить gdb.execute(self.command) к концу stop(), я получаю Python Exception <class 'gdb.error'> Cannot execute this command while the selected thread is running.:

Кто-нибудь есть рабочий пример списка команд с точки останова в питона GDB?

ответ

0

вариантов Пары попробовать:

  1. Используйте gdb.post_event от остановки(), чтобы запустить нужную команду позже. Я считаю, что вам нужно будет вернуть True из вашей функции, а затем продолжить с вашего мероприятия.
  2. Создайте нормальную точку останова и выслушайте events.stop, чтобы проверить, удалась ли ваша точка останова.
0

Метод Breakpoint.stop вызывается, когда в терминах gdb нижний по-прежнему «выполняет». Частично это бухгалтерия странности - конечно, низший не выполняет, он останавливается, а gdb выполняет бит обработки, связанную с точкой прерывания. Внутренне это больше похоже на gdb еще не решил сообщить о остановке другим заинтересованным сторонам внутри gdb. Это смешное состояние - то, что позволяет stop работать так красиво в отношении next и других команд выполнения.

Некоторые команды в gdb не могут быть вызваны во время работы нижнего уровня, например jump, как вы уже нашли.

Одна вещь, которую вы могли бы попробовать - я никогда не пробовал этого и не знаю, будет ли это работать - было бы назначить ПК в вашем методе stop. Это может сделать правильно; но, конечно же, вы должны знать, что документация предупреждает о том, чтобы делать такие странные вещи.

Несоблюдение этого, я думаю, единственный подход - вернуться к использованию commands, чтобы прикрепить jump к точке останова. Это имеет тот недостаток, что это будет мешать next.

Одним из последних способов было бы исправить выполняемый код, чтобы вставить прыжок или только последовательность из nop.

Смежные вопросы