马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、GDB 是什么
GDB 全称 GNU Debugger,是 Linux 下最常用的开源调试器,跨平台支持 Unix、类 Unix 系统,也能跑在 Windows 和 macOS 上。它的价值在于:让你在程序跑起来的过程中,能停下来看里面到底发生了什么——变量现在是多少、调用栈怎么层层叠上去、哪一行出了岔子。
它主要做三件事:
- 启动和控制程序运行:按你要求跑程序,跑到指定断点自动暂停。
- 检查程序状态:暂停时查看变量值、函数参数、调用栈、内存内容。
- 修改变量和执行流程:调试中直接改变量、改跳转路径,用来验证"如果这里值是 X 会怎样"。
二、前提:必须编出 debug 版本
这是新手最常忽略的一步。用 gcc/g++ 默认编出来的是 release 版本,不带调试信息,gdb 进去看不到源码行号。要调试得加 -g 选项:
gcc -g -o test test.c
同时别开 -O 系列优化(至少调试时关掉),优化会重排指令,断点和源码对不上,看着更懵。另外注意:gdb 跟的是可执行程序,不是源代码文件。
三、一个示例程序
#include <stdio.h>
int Sum(int s, int e)
{
int result = 0;
for(int i = s; i <= e; i++)
{
result += i;
}
return result;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}
存成 test.c,用 gcc -g -o test test.c 编出来,再 gdb ./test 进入调试。
四、纯 gdb 的短板,以及 cgdb
直接用 gdb 有个很劝退的体验:屏幕上一片黑,不显示源码,想看代码只能敲 l 一条条翻,更没有"当前执行到哪一行"的箭头。对习惯了 VS 那种可视化调试的人来说很不友好。
解决办法是用 cgdb——基于文本的 gdb 前端,把界面分成上下两栏:上半显示源码、下半是 gdb 命令行,带语法高亮、自动补全、历史命令,还有直观的断点管理和变量查看。命令用法和 gdb 完全一样,等于给 gdb 套了个可视化外壳。
sudo apt-get install cgdb
装完 cgdb ./test,绿色箭头会跟着执行走,看代码方便很多。实际项目里很多人是 cgdb 和 gdb 换着用:要精细操作用 gdb,要看代码上下文用 cgdb。
五、控制执行的一组命令
| 命令 | 作用 | 类比 VS |
| run / r | 从头开始连续运行,到断点或程序结束停下 | F5 |
| next / n | 逐过程,不进函数内部 | F10 |
| step / s | 逐语句,会进函数内部 | F11 |
| finish | 执行完当前函数就停 | Step Out |
| continue / c | 从当前位置继续跑到下一个断点 | F5 |
| until 行号 | 运行到指定行 | 跳到光标 |
| set var i=10 | 修改变量值 | watch 窗口改值 |
| quit / q | 退出调试 | 关闭 |
六、查看信息的一组命令
| 命令 | 作用 |
| list / l 行号 | 显示该行附近源码,每次约 10 行 |
| list 函数名 | 显示某个函数的源码 |
| info breakpoints | 查看断点列表 |
| display 表达式 | 每次停下来自动打印该表达式 |
| undisplay 序号 | 取消某个自动显示 |
| backtrace / bt | 查看调用栈各级函数和参数 |
| info locals | 当前栈帧的局部变量 |
| print / p 表达式 | 打印表达式当前值 |
断点相关最常用的三条:b 行号(打断点)、b 文件名:行号(跨文件时指定)、d 编号(删断点)。调试循环类问题时,配合 display 盯住循环变量,比反复 print 省事。
七、一个典型调试流程
gdb ./test
(gdb) b 20
(gdb) r
(gdb) display start
(gdb) display end
(gdb) n
(gdb) n
(gdb) bt
(gdb) quit
这段的意思:进入调试 → 在 20 行打断点 → 从头运行 → 让 start、end 每次停下都打印 → 单步走两步 → 看调用栈 → 退出。用这个套路去查"算出来不对"的问题,基本能定位到具体哪一步的值跑偏了。
八、几个坑
- 忘了加
-g,进 gdb 显示 "No symbol information",这是第一大坑。
- gdb 跟的是可执行文件,写成
gdb test.c 会直接报语法错。
- 开了
-O2,断点行号和实际执行对不上,看着像乱跳。
- 多线程程序默认只跟一个线程,要用
set scheduler-locking on 或者 thread apply all bt 看全貌。
- 程序自己 core 掉了,记得先
ulimit -c unlimited,再用 gdb ./程序 core 进去看栈。
九、小结
把 GDB 的使用压成四步:编译时加 -g 出 debug 版本 → gdb ./可执行 或 cgdb ./可执行 进入 → 打断点(b 行号)后 r 跑起来 → 用 n/s 控流程、p/display 看变量、bt 看调用栈。嫌 gdb 界面难用就装 cgdb,命令完全一致,多了源码分屏。调试时记住"改变量值"这一条能力,很多时候比反复改代码重新编译快得多。
qidao123.com企服评测-应用市场 编辑提示
|