gdb调试器是GNU开源组织发布的针对unix和linux操作系统,基于命令行的程序调试工具。gdb不像windows开发环境的图形界面调试工具,不过在linux系统下面gdb调试工具可谓是调试利器。
gdb主要功能有下面几个方面:
1.启动程序,可以按照你自己的想法和要求随心所欲的运行你的程序
2. 被调试的程序可以在你指定的调试断点处停止
3. 在程序停止期间,你可以检查你的程序中发生的所有事情
4. 动态改变程序的执行环境
在使用gdb之前,我们需要明白一点,只有带有调试信息的可执行文件才能够为我们所用。在windows程序中,就是debug模式和release模式的区别。
回想一下,前面我们也提到过,在编译的时候使用-g选项就可以生成可供调试的可执行文件。
gdb的命令很多,我们可以通过 man gdb来简单了解一下
当然了,如果小伙伴们不习惯这种命令行的方式,大家也可以使用界面调试工具。前面我也提到过使用NetBeans来开发linux程序,使用NetBeans调试程序可以让我们很方便的使用调试工具,这点看大家喜好。
不过很多时候估计我们使用图形界面都是一种奢求,所以gdb的基础知识我们还是有必要学习一下。
加载可执行文件
在gdb调试模式下,我们可以使用 file [可执行文件]来加载要调试的可执行文件。
首先,我们需要创建一个c++源文件供我们后续使用。
这里我们创建名为gdb-test.cpp的文件:
#include <iostream>
using namespace std;
int main (){
cout << "line 1" << endl;
cout << "line 2" << endl;
cout << "line 3" << endl;
cout << "line 4" << endl;
cout << "line 5" << endl;
return 0;
}
接下来我们需要编译出带调试信息的可执行文件:
g++ -g gdb-test.cpp -o gdb-test
此时目录下有以下文件:
启动gdb,加载可执行文件:
此时我们的前期工作就准备好了。
list命令查看源代码
list命令用来显示源代码,可以使用缩写的l,并且可以使用参数:
大家可以看到在不使用参数的情况下,list命令默认只会显示10行代码,想想也有道理,再多我们看起来就不太舒服了。再次输入list命令会从上面显示的末行的下一行开始显示。
list后面带一个参数,是数字哦。此时代表的意思是显示当前n行前面的5行和后面的4行。
list带两个参数:
list/l n1,n2
数字之间使用逗号分隔。
此时n1代表要显示的源代码的起始行数,n2代表结束行数。
这里还有一种操作我们也得知道,就是使用list+函数名来显示该函数上下的10行代码:
使用run命令运行程序
既然我们是调试程序,让程序跑起来才是最重要的事情。这里我们可以使用run命令来实现。
run命令可以向程序传递参数,如果参数有多个,那么使用空格分隔即可。当然了,run的缩写是r。
前面我们使用的源代码没有参数,这里我们完善一下代码:
此时我们运行程序:
惊不惊喜,意不意外,是不是以为输出是没有参数呢?
第一个参数argc,指明有多少个参数将被传递给主函数main(),真正的参数以字符串数组(即第2个参数argv[])的形式来传递。argc代表参数的数量, 可执行程序是作为第一个参数传递的,实际上我们想的参数是从argv[1]开始的。
接下来我们在gdb中传递参数:
run 参数1 参数2 ......
来向可执行文件传递参数,使用show args命令可以查看传递给main函数的参数。
如果我们使用run向main传递了参数,那么你会发现下次使用run命令时,
你没有设置参数,但是run命令会自动使用上次传递的参数。
要改变传递的参数,我们需要使用set args 参数的形式来设置。
当然了,我们每次直接带参数就不会有这样的问题了。
设置断点
使用break简写b来设置程序断点,常见的方式有一下两种:
1、通过行号来设置断点 b 行号
2、通过函数名称来设置断点 b 函数名
其他用到的命令这里在演示几个吧