当我在GDB中设置断点并将其附加到命令列表时,如果我在此命令列表中执行“下一个”,则以下命令将被忽略,这是正常的(请参阅https://sourceware.org/gdb/当前/onlinedocs/gdb/Break-Commands.html#Break-Commands)。
但是,对我来说,克服此限制可能非常有用...因此,是否可以在命令块以及以下命令中执行“下一个”?
例如:
break 8
commands
next
set i = i+1
continue
end
您不能next
或不能cont
从断点命令列表中获取信息,但是可以在Python中编写“停止事件处理程序”,然后从那里恢复劣等的执行。请参见下面的独立示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
i = atoi(getenv("i"));
if (i > 0) {
i++;
} else {
i--;
}
printf("i: %d\n", i);
return 0;
}
set confirm 0
set python print-stack full
python import gdb
file buggy
break 8
python
conditional_bpnum = int(gdb.parse_and_eval('$bpnum'))
def stop_handler(event):
if not isinstance(event, gdb.BreakpointEvent):
return
if conditional_bpnum not in set(x.number for x in event.breakpoints):
return
gdb.write('i: %d\n' % (gdb.parse_and_eval('i'),))
gdb.execute('next')
gdb.write('GDB: incrementing "i" from debugger\n')
gdb.execute('set variable i = i+1')
gdb.execute('continue')
gdb.events.stop.connect(stop_handler)
end
run
quit
$ gcc -Os -g3 buggy.c -o buggy
$ i=0 gdb -q -x next-after-break-on-conditional.gdb
Breakpoint 1 at 0x4004e3: file buggy.c, line 8.
Breakpoint 1, main () at buggy.c:9
9 i++;
i: 0
11 i--;
GDB: incrementing "i" from debugger
i: 1
[Inferior 1 (process 7405) exited normally]
stop_handler()
GDB停止时将调用,因此您必须在发出命令之前测试GDB在特定断点处是否停止。
如果我使用进行编译-O3
,则会得到可怕的“值已被优化”错误,i
并且set variable i = i+1
将失败。因此,请照常注意这一点。(Fedora 21上的gcc-4.9.2,gdb-7.8.2,x86-64)
gdb.events.stop.connect(stop_handler)
gdb.Breakpoint.num
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句