如何执行下一个内部命令列表然后执行另一个命令?

时间:2015-02-16 14:06:50

标签: gdb breakpoints

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

然而,对我来说,覆盖这个限制可能非常有用......那么,是否可以在命令块中执行“next”以及以下命令?

e.g。 :

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

2 个答案:

答案 0 :(得分:0)

  

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

不是GDB,没有。

答案 1 :(得分:0)

您不能从断点命令列表中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;
}

下后突破上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]

实施说明

每当GDB停止时都会调用

stop_handler(),因此在发出命令之前,必须测试GDB是否为特定断点停止了。

如果我使用-O3进行编译,我会将可怕的&#34;值进行优化&#34; iset variable i = i+1的错误会失败。所以一如既往地注意这一点。 (gcc-4.9.2,Fedora 21上的gdb-7.8.2,x86-64)

参考