C Gdb条件正则表达式中断

C Gdb条件正则表达式中断,c,regex,debugging,gdb,C,Regex,Debugging,Gdb,gdb是否允许有条件的正则表达式中断 我有一个源文件timer.c、一个int64_t ticks和一个函数timer_ticks()返回它。 都不是 rbreak timer.c:。如果滴答声>=24 也不是 rbreak timer.c:。如果ticks_ticks()>=24 放置任何断点 但是,如果删除正则表达式部分或条件部分,则会设置断点。不幸的是,没有 然而,有解决办法 你想有条件地中断文件中的每个函数,是吗 如果是,则可以将其用作起点,然后创建条件打断 因此,第一步:获取文件中的函

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

我有一个源文件timer.c、一个int64_t ticks和一个函数timer_ticks()返回它。 都不是

rbreak timer.c:。如果滴答声>=24

也不是

rbreak timer.c:。如果ticks_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

这里有一个方法来完成它。它需要几个步骤,并且需要对
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
(gdb)设置$i=1
(gdb)while($i cond$i ticks>=24
>设置$i=$i+1
>结束
(gdb)信息断点
Num Type Disp Enb地址什么
1个断点将y 0x080486a7保持在f.c:41处的f中
仅当滴答声>=24时停止
2断点将y 0x080486ac保持在f.c:42
仅当滴答声>=24时停止
3断点在f.c:43时保持y 0x080486b1在h中
仅当滴答声>=24时停止
4断点将y 0x08048569保持在f.c:8的主位置
仅当滴答声>=24时停止