众所周知,Linux操作系统以其开源、稳定、高效越来越多的被应用到各种IT领域。所以,gcc编译器得应用场景也越来越多。而在开发过程中,我们程序员不可能不会遇到BUG,所以GDB作为调试工具,其基本使用方法我们必须知道,才能在将来的工作上不断进取。下面我们开始吧!
GDB即Gundebugger。我们若想使用gdb进行调试,那么在编译过程中必须添加-g选项,以hello.c为例。
gcc -g -o hello hello.c
gdb完成的大部分工作都可以用很少的命令集合完成,下面我们来一一揭晓。
首先我们要做的是启动GDB:
gdb 程序名 【corefile】
其中corefile文件是可选的,但能增强gdb的调试能力。但是Linux默认是不生成corefile的,所以需要在.bashrc文件中添加
ulimit -c unlimited
修改完成后.bashrc记得保存退出后要. .bashrc让修改生效
下面以一个代码为例:
#include<stdio.h>
void test()
{
int *i=NULL;
*i=2;
}
int main()
{
printf("hello world\n");
test();
return 0;
}
编译这个程序:gcc -g -o hello hello.c
运行:程序崩溃
ls
core.xxxx hello hello.c
我们除了看到hello和hello.c文件还看到的以core打头的一个文件
现在我们开始启动gdb进行调试:
gdb hello core.xxxx
加入你不喜欢一大堆的软件信息,可以通过-q参数关闭软件信息
gdb -q hello core.xxxx
这时你可以看到gdb通过core告诉你,程序那条出现了问题。
我们要做的第一件事就是在gdb环境中运行这个程序:
gdb hello
执行:run命令
注意:gdb不但能显示出错行号,还能说明出错出现时的内存地址,这个也是潜在的有用信息。
where命令。显示导致段错误的执行函数树。
调试过程中如果知道出错行的上下文对调试程序是很有帮助的。
list [m,n],m,n是要显示包含错误首次位置的起始行和结尾行。不带参数的list将显示附近的10行代码。
gdb最有用的功能之一就是它可以显示被调试程序中任何表达式、变量的值。
print 变量,表达式。
print ‘file’ ::变量,表达式,' '是必须的,以便让gdb知道指的是一个文件名。
print funcname::变量,表达式
print i
$1=(int *)0X0
显示指针变量i的值为0
whatis命令可以告诉你变量的类型,ptype告诉你结构的定义
whatis i
type=int *
break命令设置断点
--break linenum
--break funcname
--break filename:linenum
--break filename:funcname
退出gdb,重新进入调试模式
gdb -q hello
(gdb) break 4
(gdb) run
gdb停止在第四行
continue命令从断点开始继续执行
delete删除一个断点
如果设置了很多断点,忘记了那些断点已经触发,可以使用info break
改变一个变量的值
set variable varname=value
varname是变量名称,value是变量的新值。
单步调试
step命令
--当遇到一个函数的时候,step将进入函数,每次执行一条语句,相当于step into
next命令
--当遇到一个函数的时候,next将执行整个函数,相当于step over
return 【value】命令
停止当前函数,将value返回给调用者,相当于step return
如果需要重复指向一条命令,需要每次都键入命令,gdb记住了最后一个被执行的命令,只要简单的按enter建就可以重复执行最后的命令。