本文是该系列第四篇文章,如果你没有阅读过之前的内容,可以通过以下链接进行阅读
1. Linux中编译C++代码的g++工具,以及g++的常用操作指令
创建一个C++源代码文件 src/04_debug/sum.cpp
,添加以下代码
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int N = 100;
int sum = 0;
int i = 1;
while(i <= N){
sum = sum + i;
i = i + 1;
}
cout << "sum = " << sum <<endl;
cout << "The program is over " <<endl;
return 0;
}
在进入调试模式之前,先编译源代码,如下过程。
普通编译方式
g++ sum.cpp -o no_g.out
编译出用于调试的可执行文件
g++ -g sum.cpp -o yes_g.out
使用gdb
命令进行调试,如果我们调试 no_g.out
,将会提示一下图错误
因为no_g.out
这个可执行文件不包含用于调试的信息,输入quit
再按回车即可,通过gdb yes_g.out
指令执行包含调试信息的可执行文件,看到以下输出
此时可以正常进入调试
直接执行
run
或者使用简写r
,运行结果如下图
在第11行打断点
break 11
运行结果如下图
也可以使用简写的方式,在第12行打断点
b 12
结果如下图
使用info break
指令或者指令简写i b
查看当前的断点,如下图结果
使用run
指令或者r
指令执行程序,此时命中了第11行断点,如下图内容
此时可以查看变量的值,如查看i的值,可以使用print i
或者p i
指令,如下图
使用p N
查看N的值,如下图
此时程序执行到第11行处,如果我们需要继续执行,输入continue
指令并按回车即可,程序将执行到代码的第12行,如下图
因为我们是在while
循环体内,i
的值将不断变化,如果我们需要跟中i
值的变化,需要输入display i
指令即可,再输入continue
指令让程序单步执行,如下图
可以观察到,通过循环,又回到了第一个断点,此时i
的值已经变成了2。在gdb调试中,如果我们只按回车键,gdb将执行我们最后一次输入的指令,所以我们可以一直按回车键继续让程序单步执行。
当断点执行都某个位置时,我们想要查看断点附近的代码,可以执行list
指令进行查看,如下图