1. GDB调试入门:从安装到第一个断点
大家好,我是有十多年调试经验的开发者。今天我们来聊聊GDB这个强大的调试工具,我会用最直白的方式带你从零开始掌握GDB调试。
GDB是Linux环境下最常用的调试器,它能帮你找到程序中的bug,分析程序崩溃的原因。很多人觉得命令行调试很复杂,其实一旦掌握了基本命令,你会发现它比图形界面调试器更强大、更灵活。
先来看看怎么安装GDB。在Ubuntu上很简单:
sudo apt install gdb
CentOS系统用:
sudo yum install gdb
安装完成后,用gdb --version检查是否成功。
调试前需要准备一个测试程序。创建一个简单的C++文件main.cpp:
#include <iostream>
int getAge() {
int count = 0;
count++;
std::cout << "getAge function" << std::endl;
return 1;
}
int main() {
std::cout << "Hello, World!" << std::endl;
std::cout << "getAge:" << getAge() << std::endl;
return 0;
}
编译时要加上-g参数,这样才会包含调试信息:
g++ main.cpp -g -o main_gdb
现在启动GDB调试:
gdb main_gdb
你会看到GDB的命令行界面。设置断点是最常用的功能,有几种方式:
break getAge:在函数入口设断点break 5:在第5行设断点break main.cpp:10:在指定文件的指定行设断点
设置断点后,用run命令启动程序,程序会在断点处暂停。这时候你可以检查变量值、查看调用栈,或者单步执行。
我刚开始用GDB时,最不习惯的就是命令行界面。但用久了发现,命令行操作其实更高效,特别是远程调试服务器程序时,图形界面反而麻烦。
2. 高级断点技巧:条件断点与观察点
基础的断点设置大家都会,但真正能提高调试效率的是条件断点和观察点。这些功能能让你的调试过程更加精准,避免在无关的代码上浪费时间。
条件断点特别有用。比如你有一个循环1000次的代码,但只在第500次循环时出现问题。如果每次循环都暂停,你会疯掉的。这时候条件断点就派上用场了:
break 10 if i == 500
这样只有当变量i等于500时,程序才会在第十行暂停。我有个实际案例:曾经调试一个图像处理算法,只有在处理特定大小的图片时才出问题。用条件断点根据图片尺寸设置条件,很快就定位到了问题。
观察点(watchpoint)是另一个强大功能。它不是在特定代码位置暂停,而是在变量值变化时暂停。有三种观察点:
watch variable:变量被写入时暂停rwatch variable:变量被读取时暂停awatch variable:变量被读取或写入时暂停
比如你想知道某个变量什么时候被意外修改了:
watch count
设置观察点后,每当count的值变化,GDB就会暂停并显示旧值和新值。这在调试多线程竞争条件时特别有用。
有一次我遇到一个棘手的bug:某个全局变量偶尔会被莫名其妙地修改。用普通调试方法很难追踪,因为不知道修改发生在哪里。设置了观察点后,很快就找到了罪魁祸首——一个本以为不会修改该变


634

被折叠的 条评论
为什么被折叠?



