gdb python API定义了在创建gdb.Breakpoint对象时要使用的gdb.BP_BREAKPOINT标志,但是似乎没有允许设置硬件断点的标志?我是不是遗漏了什么?
我想创建一个gdb.Breakpoint对象,这样我就可以覆盖stop方法,并在断点被触发时对它们做出反应。据我所知,没有其他方法可以做到这一点。
有趣的是,如果我以“正常”的方式设置断点(例如break *0x400123),那么gdb.breakpoints()将返回一个对象。但是,如果我以相同的方式(hbreak *0x400123)设置硬件断点,则不会返回任何对象。这似乎表明python API不能直接访问/操作硬件断点?
在Fedora 31上使用GDB 8.3.50.20190824-30.fc31。
发布于 2020-02-29 02:13:07
我还没有找到使用gdb.Breakpoint实现此目的的方法,但我有一个变通方法。
offset = 0x400123
gdb.execute("hbreak *" + hex(offset))
while True:
gdb.execute("continue")
value = int(gdb.parse_and_eval("$pc"))
if value == offset:
# respond to hardware breakpoint here
else:
# something else happened??它并不完美,但满足了我目前的需求。
发布于 2021-01-17 07:42:14
最近我也遇到了同样的问题。我发现了一种可以强制gdb使用硬件断点的变通方法。
有一个gdb auto-hw setting,它让gdb决定是自动插入硬件断点还是软件断点。默认情况下,此设置应处于启用状态。
如果gdb因为内存区域不可写而无法设置软件断点,它将插入一个硬件断点。您可以通过发出mem command来定义不可写的内存区域。
mem 0 0xffffffffffffffff ro
然后你的脚本可以创建它想要的所有断点:) (好的,至少是处理器允许它创建的所有断点)
在插入断点之后,您可以通过执行mem auto返回到正常的内存区域。
This issue已经被recently solved了。因此,我们可以预期它将在未来的gdb版本中提供:)
https://stackoverflow.com/questions/60442114
复制相似问题