段错误的调试

不同于在Windows下编程,gcc编程中经常会出现段错误,段错误出现的几种原因:

访问了不存在的内存空间

访问了系统保护的内存地址(比如0号地址)

访问只读的内存地址:动态申请的内存放到了堆内存,静态的字符串、常数放在栈内存,值不能改变。

栈溢出

看两段代码:

#include <stdio.h>
#include <stdlib.h>
void main()
{
	int *ptr = NULL;
	*ptr = 0;
}
#include <stdio.h>
#include <stdlib.h>
void main()
{
	int *ptr = (int *)0;
	*ptr = 100;
}
第一个是访问了不存在的内存地址,第二个是访问了系统保护的内存地址。

这两个文件编译都是可以通过的,但是运行会发现出现了段错误,而且利用gdb调试的方法不容易找出错误所在。

这里提供一种方法来寻找段错误的所在。

我们在执行完可执行文件时,会发现出现了段错误,这时候输入一行代码

ulimit -c 1024
意思是系统开辟1024个字节来抓取段错误的所在,并保存在一个文件里,执行完这条命令,会发现当前文件夹当中多了一个以core开头的文件,core.* ,这就说明系统抓取错误成功了,但这是一个二进制文件,是无法直接查看的。


我们可以通过gdb工具来查看这一个文件。

gdb file_name core.*

这时候我们就可以在下边看到错误在哪一行


如果你在看core.*文件是遇到了bt,说明存在堆栈错误,bt就是打印出堆栈错误信息。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值