gdb 简介
gdb
是 UNIX
及 UNIX-like
下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上的集成开发环境 IDE
提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了 gdb 调试的常用命令,调试出程序会很有成就感,一方面因为这些命令就类似图形界面调试按钮背后的逻辑,另一方面用命令行来调试程序,逼格瞬间就上了一个档次,这次就跟大家分享 gdb 调试的基本技术和 15 个常用调试命令。
在此之前,我们先来回顾下在 Windows 上使用 IDE 的图形界面调试过程。
IDE 的调试步骤
在 Windows 的 IDE 下调试程序,例如使用 VS,一般都有下面这几个操作:
1. Debug 模式编译并启动程序
2. 程序运行出错,打断点分析出错的地方
3. 单步运行程序,包括:step over
单步执行;step into
跳入函数;step return
跳出函数
4. 还有全速运行,打印或者监视变量,冻结或解冻线程等调试技术
在 IDE 中上面的这些步骤一般都有固定的按钮提供给我们使用,非常的简单方便,我们只要多练习练习,在图形界面调试程序不会很难,但是在 Linux 下用命令来调试程序就比图形界面要复杂很多了。
其实,你知道真正的调试高手是什么样的吗?就是 Ta 对计算机原理和程序本身的逻辑理解非常深刻,在 Ta 的脑海中已经可以模拟程序的运行过程,并且知道可能出错的地方,这样连断点都不用打了,而且 Bug 的命中率也不低,或许这就是真正的大佬吧 :)
我们回到正题,来介绍在 Linux 使用命令行的调试过程。
gdb 的调试步骤
在 Linux 下既然是使用命令行来调试,顾名思义就是手敲命令来调试程序,大体分为下面几个步骤,后面会详细介绍:
1. 编译可以调试的程序
2. 运行程序,打断点
3. 单步调试,监控变量
4. 可视化调试
5. 其他调试技术
可以看出,与 IDE 调试过程差不多,但是实际操作起来可是千差万别,可不是点按钮了,而是自己敲调试程序的命令,就相当于你正在学习那些调试按钮背后的原理,把这种方法学会,不用学就会使用 IDE 来调试程序,不管你信不信,我反正是信了 :)
下面开始正式的调试技术介绍。
15 个 gdb 调试基础命令
下面来正式介绍 gdb 常用的调试技术,都是调试命令,只看不做比较乏味,还是建议你跟我一起动手调试下面的程序,这样才能真正的学会,这是本次要调试的 hello.c
程序,非常简单:
#include <stdio.h>
int add(int x, int y) {
return x + y;
}
int main() {
int a = 1;
int b = 2;
printf("a = %d\n", a);
printf("b = %d\n", b);
int c = add(a, b);
printf("%d + %d = %d\n", a, b, c);
return 0;
}
1. 编译可以调试的程序
我们平常使用 gcc 编译的程序如果不加 [-g]
选项:
gcc hello.c -o hello
gdb 会提示该可执行文件没有调试符号,不能调试:
gdb hello
# gdb 提示信息
Reading symbols from a.out...(no debugging symbols found)...done.
如果需要让程序可以调试,就必须在编译的时候加上 [-g]
参数:
gcc -g hello.c -o hello
2. 载入要调试的程序
我们在命令行下需要手动载入待调试的程序,有 2 种方法: