目录
前面我们学习了如何使用gcc/g++来进行对代码进行编译,本章我们将使用gdb来对代码进行调试,学习本章的前提是有一定的调试基础,有在vs等软件上有调试经历的,若无这方面经历,建议先了解一下再来阅读本篇文章;
gdb是Linux下一款命令式调试工具,我们在VS等IDE进行代码编写时,我们编写完代码,若代码运行结果不如我们所料,我们通常会去进行调试,而这里有一个细节,我们点F5编译并运行程序时,实际上这里的编译有两种选择,一种的Debug版本,另一种就是Release版本,我们必须选择Debug版本才可以进行调试,而gcc中默认是Release版本进行编译的,我们必须带上 -g选项才可,如下图所示,我写了如下代码,并进行编译;
- #include
- // 从1加到100
- int AddToHun()
- {
- printf("Enter AddToHun\n");
- int ret = 0;
- int i = 0;
- for(i = 0; i <= 100; i++)
- {
- ret += i;
- }
- printf("Exit AddToHun\n");
- return ret;
- }
-
- int main()
- {
- printf("Enter Main\n");
-
- int n = AddToHun();
-
- printf("ret=%d\n", n);
-
- printf("Exit Main");
- return 0;
- }
我们用下面指令分别编译出Release版本和Debug版本;
我们不难看出我们的Debug版本比Release版本大一些,因为我们的Debug版本要保存调试信息,我们可以通过 readelf 来查看Debug版本是否真的保存了调试信息;
readelf -S 文件名
我们看到其中保存了很多关于debug的信息;
我们分别用Release版本的可执行程序和Debug版本的可执行程序进行调试,看是否如我们所料,Release版本可执行程序不可调试,以下为选择调试文件的指令;
gdb 要调试的文件
我们选择Release版本可执行程序,我们发现gdb没有找到我们的调试信息,如上图所示,接着我们在试着选择Debug版本文件(输出q退出gdb);
我们发现,刚才的提示消失了,证明了我们的Debug版本的可执行程序才可进行调试;
l 行号:从指定行开始查看部分代码,我们需要继续输入 l ,才会显示后面的代码;
注意:我们可以直接回车换行,因为我们的gdb有记录上一次执行命令的功能;
这里运行代码我们介绍三个指令,分别对应VS中的F5,F10和F11
r:运行代码直至遇到断电或程序结束(F5)
n:逐过程运行代码,遇到函数不进去(F10)
s:逐语句运行代码,遇得到函数进去(F11)
b 行号:给指定行打上断点,此时gdb会给该断点分配编号
info b:显示当前有那些断点
d 断点编号:删除指定断点编号的断点
disable 断点编号:使指定断点失效
enable 断点编号:使指定断点有效
c:执行到程序末尾或下一个断点处停下来
p 变量名:显示指定变量的值
display 变量名:常显示指定变量名(每次执行都会打印该变量值)
bt:查看当前调用堆栈
finish:完成当前函数后停下来
until 行号:跳转至指定行
对于新手来说,我们学会上述所有指令即可,上述指令已经可以满足大部分需求,若有其他需求查看文档即可;