如何执行完成,然后从命令内执行另一个命令?

Ran*_*lue 11 c gdb

这是我的代码结构的简化示例:

void increment(int j);

int main()
{
  int i = 0;

  while(1) {
    i = increment(i);
  }

  return 0;
}

int increment(int j)
{
  return j + 1;
}
Run Code Online (Sandbox Code Playgroud)

这是相应的GDB脚本:

b increment
command 1
finish
print i
continue
end
Run Code Online (Sandbox Code Playgroud)

问题是该finish命令阻止了之后的命令(即print icontinue)被调用.

有没有办法告诉GDB i在任何increment电话后立即打印?

mat*_*att 9

您可以通过将所有命令包装在单个python调用中来解决此错误,例如

(gdb) break doSomething
Breakpoint 1 at 0x400478: file iter.c, line 5.
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>python gdb.execute("print i"); gdb.execute("finish"); gdb.execute("print i");
>end

Breakpoint 1, doSomething () at iter.c:5
5     while (i < 5)
$1 = 0
main (argc=1, argv=0x7fffffffe178) at iter.c:13
13    return 0;
$2 = 5
Run Code Online (Sandbox Code Playgroud)

编辑:第二个解决方法不需要python似乎是定义一个新的gdb命令并在命令中运行它:

define foo
print *i
set $addrOfI = i
finish
print *$addrOfI
end

break doSomething
commands
foo
end
Run Code Online (Sandbox Code Playgroud)

  • 非 Python 解决方法在某些情况下不起作用(嵌套函数调用在嵌套函数和嵌套函数上都带有断点)。我相信原因是该解决方法以某种方式弄乱了 GDB 的事件循环。我认为避免这种情况的唯一可靠方法是在 Python 中定义一个命令,该命令使用带有合适对象的 `gdb.post_event()` 将意在跟随 `finish` 的命令添加到 GDB 的事件队列。当然,这会导致嵌套断点的各种怪异现象。下面答案中的错误报告解释了所有这些的根本原因:没有适当的状态机用于 infrun。唉。 (2认同)