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??
它并不完美,但满足了我目前的需求。