gdb调试的技巧

1.调试过程中,可以修改变量的值,改变程序的执行路径

2.在调试过程,为了弄清楚某段程序的具体含义,初级做法是在程序加入输出信息,这种做法比较麻烦,需要经常修改源程序,重新构建,可以使用gdb对某段程序进行单步调试,以弄清楚程序的执行逻辑,在使用gdb的过程中,经常遇到当满足某种特殊条件下去查看程序的执行逻辑,初级做法是在程序中加入如下代码段

if(condition)
{
  cout << "prompt information" << endl;  //  the position of breakpoint
}

这种做法的缺点上面已经说过,这里介绍一种简单的方法,使用gdb的条件断点,顾名思义,就是可以设置当满足某种条件的情况下,程序可以在某行停下

以下通过一个程序说明如何设置条件断点

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int main() {
  char str1[15] = "char";
  string str2 = "string";
  char temp[5];

  for(int i=0; i<15; i++) {
    memset(temp, 0, sizeof(temp));
    sprintf(temp, "%d", i);
    strcat(str1, temp);
    cout << str1 << endl;
    str2 = str2 + temp;
    cout << str2 << endl;
  
    strcpy(str1, "char");
    str2 = "string";
  }

  return 0;
}

执行命令

g++ -g testBreakPoint.cpp -g testBreakPoint
gdb testBreakPoint
b 16 if $_regex(str1, ".*char11.*")
r

当程序运行暂停时,执行“info locals”,执行结果如下所示:
i = 11
str1 = "char11\000\000\000\000\000\000\000\000"
str2 = "string"
temp = "11\000\000"

执行“delete 1”,删除设置的断点,执行下面的命令设置一个新的断点,并重新运行程序
b 18 if $_regex(str2.c_str(), ".*string11.*")
r

当程序运行暂停时,执行“info locals”,执行结果如下所示:
i = 11
str1 = "char11\000\000\000\000\000\000\000\000"
str2 = "string11"
temp = "11\000\000"

备注:这里分别设置当(char*)str1包含子串“char11”,程序暂停,当(std::string)str2包含子串“string11”时,程序暂停,笔者在调试过程使用strcmp、strstr方法设置当某字符串满足特定条件时,未能成功暂停程序,故转向使用gdb提供的函数,这里使用了$_regex(str1, str2),其中str1是char*类型的字符串,str2指定待匹配的字符串模式

当然,第一,测试C-style string是否与一个字符串相等,也可以使用strcmp,例如,gdb命令为“b 16 if strcmp(str1, "char6")==0”;第二,测试C++ string是否与一个字符串相等,也可以使用strcmp,例如,gdb命令为“b 18 if strcmp(str2.c_str(), "string6")==0”或“b 18 if str2.compare("string6")==0”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值