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”
如果调试程序某个函数有打印语句,可以在gdb中使用p或call调用这个函数打印信息
p called_function()
打印语句会显示在启动gdb的控制台中。