加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

GDB条件断点 condition命令 解说

发布时间:2022-07-11 14:12:21 所属栏目:语言 来源:互联网
导读:前面章节给大家介绍了 GDB 调试器中普通断点、观察断点以及捕捉断点的功能和用法。其中值得一提的是,对于普通断点的建立,可以使用如下格式的 break 命令: (gdb) break ... if cond ... 参数用于指定生成断点的具体位置;cond 参数用于代指某个表达式。
  前面章节给大家介绍了 GDB 调试器中普通断点、观察断点以及捕捉断点的功能和用法。其中值得一提的是,对于普通断点的建立,可以使用如下格式的 break 命令:
  (gdb) break ... if cond
 
  ... 参数用于指定生成断点的具体位置;cond 参数用于代指某个表达式。通过此方式建立的普通断点,只有当表达式 cond 成立(值为 True)时,才会发挥它的作用;反之,断点并不会使程序停止执行。
 
  类似上面这种,以某个表达式的是否成立作为条件,从而决定自身是否生效的断点,又称为条件断点。除了普通断点外,观察断点和捕捉断点也可以成为条件断点。
 
  需要说明的是,创建普通条件断点的方式,也同样适用于观察条件断点。通过执行如下命令,即可直接生成一个观察条件断点:
  (gdb) watch expr if cond
 
  参数 expr 表示要观察的变量或表达式;参数 cond 用于代指某个表达式。
 
  但是,以上创建条件断点的方法,不适用于捕捉断点。换句话说,捕捉条件断点无法直接生成,需要借助 condition 命令为现有捕捉断点增添一个 cond 表达式,才能使其变成条件断点。
 
  总的来说,借助 condition 命令,我们可以将现有的普通断点、观察断点以及捕捉断点变成条件断点;而普通条件断点和观察条件断点,可以分别通过 break if 命令和 watch if 命令直接生成。
 
  接下来,我将给大家详细地讲解 condition 命令的用法。
  GDB condition命令
  严格来说,condition 命令的功能是:既可以为现有的普通断点、观察断点以及捕捉断点添加条件表达式,也可以对条件断点的条件表达式进行修改。
 
  condition 命令没有缩写形式,使用方法很简单,语法格式如下:
  (gdb) condition bnum expression
  (gdb) condition bnum
 
  参数 bnum 用于代指目标断点的编号;参数 expression 表示为断点添加或修改的条件表达式。
 
  以上 2 种语法格式中,第 1 种用于为 bnum 编号的断点添加或修改 expression 条件表达式;第 2 种用于删除 bnum 编号断点的条件表达式,使其变成普通的无条件断点。
 
  举个例子,这里以调试如下 C++ 程序为例:
  #include <iostream>
  using namespace std;
  int main(){
      int num = 1;
      while(num<20){
          try{
              throw num;
          }catch(int &e){
              num++;
          }
      }
      cout << num << endl;
      return 0;
  }
  程序存储位置为~/demo/main.cpp,并已经生成了可供 GDB 调试器使用的执行文件:
  [root@bogon demo]# ls
  main.cpp  main.exe
  [root@bogon demo]# gdb main.exe -q
  Reading symbols from ~/demo/main.exe...done.
  (gdb) l
  1 #include <iostream>
  2 using namespace std;
  3 int main(){
  4     int num = 1;
  5     while(num<20){
  6         try{
  7             throw num;
  8         }catch(int &e){
  9             num++;
  10         }
  (gdb)
  11     }
  12     cout << num << endl;
  13     return 0;
  14 }
  (gdb)
 
  可以看到,通过借助 condition 命令为不同类型断点设置条件表达式,只有当条件表达式成立(值为 True)时,相应的断点才会触发从而使程序暂停运行。
  GDB ignore命令
  ignore 命令也可以使一个断点成为条件断点,但这里的“条件”并非自定义的表达式,而仅为一个整数,它用来表示该断点失效的次数。也就会说,ignore 命令可以使目标断点暂时失去作用,当断点失效的次数超过指定次数时,断点的功能会自动恢复。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读