gdb 允许条件正则表达式中断吗?
我有一个源文件timer.c
,一个int64_t
滴答声,以及一个返回它的函数timer_ticks()
。也不
rbreak timer.c:. if ticks >= 24
也不
rbreak timer.c:. if ticks_ticks() >= 24
放置任何断点。
但是,如果我删除正则表达式部分或条件部分,则会设置断点。
这里有一种方法可以完成它。它需要几个步骤,并且需要对gdb
的输出进行一些目视检查。
首先,运行 rbreak
命令并记下它设置的断点编号。
(gdb) rbreak f.c:.
Breakpoint 1 at 0x80486a7: file f.c, line 41.
int f();
Breakpoint 2 at 0x80486ac: file f.c, line 42.
int g();
Breakpoint 3 at 0x80486b1: file f.c, line 43.
int h();
Breakpoint 4 at 0x8048569: file f.c, line 8.
int main(int, char **);
现在,循环遍历该范围的断点,并使用 cond
命令将条件添加到每个断点:
(gdb) set $i = 1
(gdb) while ($i <= 4)
>cond $i ticks >= 24
>set $i = $i + 1
>end
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x080486a7 in f at f.c:41
stop only if ticks >= 24
2 breakpoint keep y 0x080486ac in g at f.c:42
stop only if ticks >= 24
3 breakpoint keep y 0x080486b1 in h at f.c:43
stop only if ticks >= 24
4 breakpoint keep y 0x08048569 in main at f.c:8
stop only if ticks >= 24
不幸的是,不,它没有。
但是,有解决方法。
你想有条件地破坏文件中的每个函数,不是吗?
如果是,则可以使用此答案作为起点,然后创建条件中断。
因此,第一步:获取文件中的函数列表:
nm a.out | grep ' T ' | addr2line -fe a.out |
grep -B1 'foo.cpp' | grep -v 'foo.cpp' > funclist
下一步:创建创建中断的 gdb 脚本:
sed 's/^/break /' funclist | sed 's/$/ if ticks>=24/' > stop-in-foo.gdb
最后,在 gdb 中导入脚本:
(gdb): source stop-in-foo.gdb