不是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中有一个带断点的命令列表的工作示例吗?
答案 0 :(得分:0)
当用gdb术语表示下级仍在“执行”时,调用Breakpoint.stop
方法。部分这是一个簿记奇怪 - 当然,下级并没有真正执行,它停止,而gdb做了一些断点相关的处理。在内部,更像是gdb尚未决定向gdb内的其他感兴趣的各方报告停止。这个有趣的状态让stop
能够很好地与next
和其他执行命令一起工作。
如下所示,在下级运行时,无法调用gdb中的某些命令,如jump
。
你可以尝试的一件事 - 我从未尝试过这个并且不知道它是否会起作用 - 将是用stop
方法分配给PC。这可能是正确的;但是当然你应该知道文档警告不要做这样奇怪的事情。
如果不这样做,我认为唯一的方法是回退到使用commands
将jump
附加到断点。这样做的缺点是它会干扰next
。
最后一种方法是修补正在运行的代码以插入跳转或只是nop
s的序列。
答案 1 :(得分:0)
有两种选择: