2015-07-13 44 views
1

不是this question的重复,因为我正在通过python接口来处理gdb。
This one是类似的,但没有答案。通过python接口在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

当以gdb的形式表示劣势仍在“执行”时,将调用Breakpoint.stop方法。部分原因是这是一种簿记怪异 - 当然,劣势并不真正执行,当gdb执行一些与断点相关的处理时,它会停止。在内部,它更像是gdb尚未决定向gdb内的其他相关方报告停止。这个有趣的状态是什么让stop工作很好地相对于next和其他执行命令。

gdb中的一些命令无法在劣势正在运行时调用,如jump,正如您找到的那样。

有一件事你可以尝试 - 我从来没有尝试过这个,不知道它是否会工作 - 将被分配到您的stop方法的PC。这可能做正确的事情;但是当然你应该知道文档警告不要做这样的怪事。

如果没有,我认为唯一的办法是回退到使用commandsjump附加到断点。这有缺点,它会干扰next

最后一种方法是修补正在运行的代码以插入一个跳转或只是一个序列nop s。