通过python接口在gdb中的断点处执行命令

时间:2015-07-13 10:19:57

标签: python gdb

不是this question的副本,因为我正在通过python接口处理gdb。
This one类似但没有答案。

我在python中扩展gdb.breakpoint,以便将某些寄存器写入文件,然后跳转到一个地址:在0x4021ee,我想写东西到文件,然后跳转到{ {1}}

然而,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 gdb中有一个带断点的命令列表的工作示例吗?

2 个答案:

答案 0 :(得分:0)

当用gdb术语表示下级仍在“执行”时,调用Breakpoint.stop方法。部分这是一个簿记奇怪 - 当然,下级并没有真正执行,它停止,而gdb做了一些断点相关的处理。在内部,更像是gdb尚未决定向gdb内的其他感兴趣的各方报告停止。这个有趣的状态让stop能够很好地与next和其他执行命令一起工作。

如下所示,在下级运行时,无法调用gdb中的某些命令,如jump

你可以尝试的一件事 - 我从未尝试过这个并且不知道它是否会起作用 - 将是用stop方法分配给PC。这可能是正确的;但是当然你应该知道文档警告不要做这样奇怪的事情。

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

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

答案 1 :(得分:0)

有两种选择:

  1. 使用stop()中的gdb.post_event稍后运行所需的命令。我相信您需要从您的功能中返回True,然后从您的活动中呼叫继续。
  2. 创建一个普通断点并收听events.stop以检查您的断点是否被击中。