Gdb 如何在命令列表中执行下一个命令,然后执行另一个命令?
当我在GDB中设置一个断点并向其附加一个命令列表时,如果我在这个命令列表中执行一个next,以下命令将被忽略,这是正常的,请参见 然而,它可能是非常有用的,我可以覆盖这个限制。。。那么,是否可以执行命令块中的下一个命令以及以下命令 e、 g:Gdb 如何在命令列表中执行下一个命令,然后执行另一个命令?,gdb,breakpoints,Gdb,Breakpoints,当我在GDB中设置一个断点并向其附加一个命令列表时,如果我在这个命令列表中执行一个next,以下命令将被忽略,这是正常的,请参见 然而,它可能是非常有用的,我可以覆盖这个限制。。。那么,是否可以执行命令块中的下一个命令以及以下命令 e、 g: break 8 commands next set i = i+1 continue end 那么,是否可以执行命令块中的下一个命令以及以下命令 没有GDB,不。您不能从断点命令列表中执行next或cont,但您可以用Py
break 8
commands
next
set i = i+1
continue
end
那么,是否可以执行命令块中的下一个命令以及以下命令
没有GDB,不。您不能从断点命令列表中执行next或cont,但您可以用Python编写一个停止事件处理程序,然后从那里继续执行。请参见下面的自包含示例:
四轮马车
示例会话
实施说明
只要GDB停止,就会调用stop_处理程序,因此在发出命令之前,必须测试GDB是否停止了特定断点
如果我用-O3编译,我会得到一个可怕的值,这个值已经被优化了,错误为I,设置变量I=I+1将失败。所以像往常一样要小心。Fedora21x86-64上的gcc-4.9.2、gdb-7.8.2
工具书类
:调试器方便变量“$bpnum”记录您最近设置的断点的数目
:gdb.events.stop.connectstop\u处理程序
:gdb.Breakpoint.num
如果您只是在断点命中后无条件地执行next,那么您也可以在第9行设置断点,对吗?您能展示一个更好地展示您的约束的用例吗?是的,我考虑过,但在某些情况下,它不起作用。例如:ifi>0{i++;}else{i-;}在这种情况下,如果我想在i++指令之后中断,并且我在这一行设置了断点,那么真正的断点将放在else块中的i-行。然后,如果条件满足,i-线将永远不会到达,因此我的断点将永远不会被击中。非常感谢可能的重复!它起作用了!实际上,针对我的具体问题,我用python创建了一个新命令,并在这个命令中执行gdb.executenext,但正是您的回答让我想到了这一点。
#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]