Gdb 如何在命令列表中执行下一个命令,然后执行另一个命令?

Gdb 如何在命令列表中执行下一个命令,然后执行另一个命令?,gdb,breakpoints,Gdb,Breakpoints,当我在GDB中设置一个断点并向其附加一个命令列表时,如果我在这个命令列表中执行一个next,以下命令将被忽略,这是正常的,请参见 然而,它可能是非常有用的,我可以覆盖这个限制。。。那么,是否可以执行命令块中的下一个命令以及以下命令 e、 g: break 8 commands next set i = i+1 continue end 那么,是否可以执行命令块中的下一个命令以及以下命令 没有GDB,不。您不能从断点命令列表中执行next或cont,但您可以用Py

当我在GDB中设置一个断点并向其附加一个命令列表时,如果我在这个命令列表中执行一个next,以下命令将被忽略,这是正常的,请参见

然而,它可能是非常有用的,我可以覆盖这个限制。。。那么,是否可以执行命令块中的下一个命令以及以下命令

e、 g:

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]