GDB Python API:创建硬件断点对象



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。

我最近也遇到了同样的问题。我找到了一个巧妙的解决方法来强制gdb使用硬件断点。

gdbauto-hw设置允许gdb决定是自动插入硬件断点还是软件断点。默认情况下,此设置应处于启用状态。

如果gdb由于内存区域不可写而无法设置软件断点,它将插入硬件断点。您可以通过发出mem命令来定义不可写的内存区域。

mem 0 0xffffffffffffffff ro

然后你的脚本可以创建它想要的所有断点:((好吧,至少是处理器允许它创建的所有断点(

插入断点后,可以通过执行mem auto返回到正常内存区域。

这个问题最近得到了解决。因此,我们可以预期它将在gdb的未来版本中可用:(

我还没有找到使用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??

它并不完美,但满足了我目前的需求。

最新更新