Linux--GDB调试

众所周知,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建就可以重复执行最后的命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值