【问题标题】:How to execute next inside commands list and then another command?如何在命令列表中执行下一个命令,然后执行另一个命令?
【发布时间】:2015-02-16 14:06:49
【问题描述】:

当我在 GDB 中设置断点并为其附加命令列表时,如果我在此命令列表中执行“next”,则会忽略以下命令,这是正常的(参见 https://sourceware.org/gdb/current/onlinedocs/gdb/Break-Commands.html#Break-Commands)。

但是,覆盖此限制对我来说可能非常有用...那么,是否可以在命令块中执行“下一步”以及以下命令?

例如:

break 8
  commands
    next
    set i = i+1
    continue
  end

【问题讨论】:

  • 如果你只是在断点命中后无条件地执行“下一步”,你也可以在第 9 行设置断点,对吧?您能否展示一个更好地展示您的约束的用例?
  • 是的,我想过,但在某些情况下,它不起作用。例如:if(i > 0) { i++; } else { i--; } 在这种情况下,如果我想在 i++ 指令之后中断,并且我在这一行设置断点,“真正的”断点将放在“i-- 行”(在else 块)。然后,如果条件满足,“i--line”将永远不会到达,所以我的断点永远不会被命中。

标签: gdb breakpoints


【解决方案1】:

您不能在断点命令列表中使用nextcont,但您可以在 Python 中编写“停止事件处理程序”,然后从那里恢复较差的执行。请参阅下面的独立示例:

buggy.c

#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;
}

next-after-break-on-conditional.gdb

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 编译,我会得到iset variable i = i+1 的可怕的“值已被优化”错误。所以像往常一样注意这一点。 (gcc-4.9.2, gdb-7.8.2 on Fedora 21, x86-64)

参考文献

【讨论】:

  • 非常感谢!有用 !实际上,针对我的具体问题,我在 python 中创建了一个新命令,并在此命令中执行gdb.execute("next"),但正是你的回答让我想到了这一点。
【解决方案2】:

那么,是否可以在命令块中执行“下一步”以及以下命令?

不使用 GDB,不。

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2020-10-13
    相关资源
    最近更新 更多