gdb条件断点的值一定会断吗_GDB条件断点

GDB条件断点

在通过GDB调试程序时,可以通过 break 创建普通断点。但是普通断点的建立,可以使用如下格式的 break 命令:

(gdb) break ... if cond

... 参数用于指定生成断点的具体位置;cond 参数用于代指某个表达式。通过此方式建立的普通断点,只有当表达式 cond 成立(值为 True)时,才会发挥它的作用;反之,断点并不会使程序停止执行。

类似上面这种,以某个表达式的是否成立作为条件,从而决定自身是否生效的断点,又称为条件断点。除了普通断点外,观察断点和捕捉断点也可以成为条件断点。

需要说明的是,创建普通条件断点的方式,也同样适用于观察条件断点。通过执行如下命令,即可直接生成一个观察条件断点:

(gdb) watch expr if cond

参数 expr 表示要观察的变量或表达式;参数 cond 用于代指某个表达式。

但是,以上创建条件断点的方法,不适用于捕捉断点。换句话说,捕捉条件断点无法直接生成,需要借助 condition 命令为现有捕捉断点增添一个 cond 表达式,才能使其变成条件断点。

总的来说,借助 condition 命令,我们可以将现有的普通断点、观察断点以及捕捉断点变成条件断点;而普通条件断点和观察条件断点,可以分别通过 break if 命令和 watch if 命令直接生成。。

GDB condition命令

condition 命令的功能是:既可以为现有的普通断点、观察断点以及捕捉断点添加条件表达式,也可以对条件断点的条件表达式进行修改。condition 命令没有缩写形式,使用方法很简单,语法格式如下:

(gdb) condition bnum expression

(gdb) condition bnum

参数 bnum 用于代指目标断点的编号;参数 expression 表示为断点添加或修改的条件表达式。

以上 2 种语法格式中,第 1 种用于为 bnum 编号的断点添加或修改 expression 条件表达式;第 2 种用于删除 bnum 编号断点的条件表达式,使其变成普通的无条件断点。

以调试如下 C++ 程序为例:

#include

using namespacestd;intmain(){int num = 1;while(num<20){try{thrownum;

}catch(int &e){

num++;

}

}

cout<< num <

}

接下来,演示 condition 命令的功能和用法:

[root@bogon demo]# gdb main.exe -q

Reading symbolsfrom ~/demo/main.exe...done.

(gdb) l1 #include

2 using namespacestd;3 intmain(){4 int num = 1;5 while(num<20){6 try{7 thrownum;8 }catch(int &e){9 num++;10}

(gdb)11}12 cout << num <

(gdb)

(gdb) b 9

Breakpoint1 at 0x12d0: file main.cpp, line 9.

(gdb) r

Starting program:/home/test/demo/main.exe

Breakpoint1, main () at main.cpp:9

9 num++;

(gdb) rwatch num

Hardware read watchpoint2: num

(gdb)catch throw int

Catchpoint3 (throw)

(gdb) infobreakNum Type Disp Enb Address What1 breakpoint keep y 0x00005555555552d0 in main() at main.cpp:9 breakpoint already hit 1time2read watchpoint keep y num3 catchpoint keep y exception throw matching: int(gdb) condition1 num==3

(gdb) condition2 num==5

(gdb) condition3 num==7

(gdb) c

Continuing.

Breakpoint1, main () at main.cpp:9

(gdb) p num

$1 = 3(gdb) c

Continuing.

Hardware read watchpoint2: num

Value= 5

0x000055555555526f in main () at main.cpp:7

7 thrownum;

(gdb) c

Continuing.

Catchpoint3 (exception thrown), 0x00007ffff7e81762 in __cxa_throw ()

#1 0x0000555555555285 in main () at main.cpp:7

7 thrownum;

(gdb) p num

$2 = 7(gdb)

可以看到,通过借助 condition 命令为不同类型断点设置条件表达式,只有当条件表达式成立(值为 True)时,相应的断点才会触发从而使程序暂停运行。

GDB ignore命令

ignore 命令也可以使一个断点成为条件断点,但这里的“条件”并非自定义的表达式,而仅为一个整数,它用来表示该断点失效的次数。也就会说,ignore 命令可以使目标断点暂时失去作用,当断点失效的次数超过指定次数时,断点的功能会自动恢复。

ignore 命令也没有缩写形式,其语法格式如下:

ignore bnum count

参数 bnum 为某个断点的编号;参数 count 用于指定该断点失效的次数。

(gdb) b 9Breakpoint1 at 0x400a33: file main.cpp, line 9.

(gdb) r

Starting program:~/demo/main.exe

Breakpoint1, main () at main.cpp:9

9 num++;

(gdb) p num

$1 = 1(gdb) ignore1 3Will ignore next3 crossings of breakpoint 1.

(gdb) c

Continuing.

Breakpoint1, main () at main.cpp:9

9 num++;

(gdb) p num

$2 = 5(gdb)

可以看到,执行 ignore 命令之前,num 变量的值为 1。借助 ignore 命令使编号为 1(作用于第 9 行)的断点失效 3 次后,继续执行程序,最终程序仍暂停至第 9 行,此时 num 的值变为 5。这这恰恰证明了 num 从 1 递增至 5 的过程中,编号为 1 的断点失效了 3 次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值