1. 简介
GNU调试器(GDB)是一个标准的Unix程序,提供了许多调试功能,可以用于调试C、C++、Ada和其他语言编写的程序。在Linux系统中,GDB通常是由GNU Project提供的一个完全免费的工具。在Linux中,程序中出现错误时,使用GDB可以方便地定位问题。
2. 安装GDB
2.1 确认已安装gcc
在安装GDB之前,需要确认系统中是否已经安装了gcc。
sudo apt update
sudo apt install -y gcc
注意:系统中已经安装了gcc的情况下可以直接跳过这个步骤。
2.2 安装GDB
在确认已经安装gcc之后,可以在终端中输入以下命令安装GDB。
sudo apt-get update
sudo apt-get install gdb
该命令将在系统上安装最新的GDB版本。如果您想要安装特定的版本,可以在上述命令后添加版本号,例如:
sudo apt-get install gdb=8.1.1-0ubuntu1
3. 使用GDB
3.1 常用指令
使用GDB可以在程序的调试过程中获得更加详细的信息。以下是一些常用的GDB指令。
run: 执行程序
break: 设置断点,例如 break main
将在程序的主函数处设置断点
info: 显示程序的信息,例如 info breakpoints
可以查看断点的信息
next: 执行下一行代码,但不会进入函数内部
step: 执行下一行代码,并进入函数内部
continue: 从断点处恢复程序的执行
print: 显示变量的值,例如 print i
可以显示变量i的值
watch: 监视变量的值,例如 watch i
将会在变量i的值发生变化时暂停程序的执行
quit: 退出GDB
3.2 使用示例
下面是一个使用GDB的例子。
假设以下的C++程序的文件名为test.cpp,输出最大值和最小值。
#include <iostream>
using namespace std;
int main()
{
int arr[5] = {5, 6, 9, 1, 8};
int max = arr[0], min = arr[0];
for(int i = 1;i < 5;i++)
{
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
}
cout << "Max value is " << max << endl;
cout << "Min value is " << min << endl;
return 0;
}
在终端中使用以下命令进行编译执行。
g++ test.cpp -o test
./test
多次执行上述命令,程序输出的结果不会变化。但是,我们希望在每次运行程序时,程序会随机生成一些数字,然后输出最大值和最小值。以下是修改后的程序。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
int arr[5];
srand((unsigned)time(NULL));
for(int i = 0;i < 5;i++)
{
arr[i] = rand() % 100 + 1;
cout << arr[i] << " ";
}
cout << endl;
int max = arr[0], min = arr[0];
for(int i = 1;i < 5;i++)
{
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
}
cout << "Max value is " << max << endl;
cout << "Min value is " << min << endl;
return 0;
}
我们重新编译并运行程序。
g++ test.cpp -o test
./test
程序输出随机生成的数字和最大值、最小值。但是,我们发现在某些情况下,程序的输出不正确,需要进行调试。
在终端中输入以下命令使用GDB对程序进行调试。
gdb ./test
在GDB命令行中,输入以下命令设置断点。
break main
然后使用以下命令运行程序。
run
程序的执行被暂停,此时在终端中可以查看程序的状态和变量的值等信息。使用以下命令查看当前的变量值。
print arr
print i
发现在程序执行时,数组arr中的元素值全部为0。使用以下命令继续执行程序。
continue
程序继续执行,可以在终端中看到程序输出了错误的结果。
这时我们使用了之前介绍的watch命令监视arr这个数组,并在程序运行时,断点中断后,查看arr的值。由此,我们找到了程序输出错误的原因。
4. 总结
使用GDB可以方便地定位程序中出现的问题,借助各种指令,可以更好地理解程序的运行过程。掌握GDB的使用方法可以提高程序的调试效率。