Gdb条件正则表达式中断

时间:2014-02-10 00:33:00

标签: c regex debugging gdb

gdb是否允许条件正则表达式中断?

我有一个源文件timer.c,一个int64_t ticks,以及一个返回它的函数timer_ticks()。 既不

  

rbreak timer.c:。如果ticks> = 24

,也不

  

rbreak timer.c:。如果ticks_ticks()> = 24

放置任何断点。

如果我删除正则表达式部分或条件部分,则设置断点。

2 个答案:

答案 0 :(得分:1)

不幸的是,不,它没有。

但是,有解决方法。

你想有条件地从文件中删除每个函数,不是吗?

如果是,您可以使用此answer作为起点,然后创建条件中断。

所以,第一步:获取文件中的函数列表:

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

答案 1 :(得分:1)

这是一种完成它的方法。它需要几个步骤,并且需要对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