段错误的调试

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

访问了不存在的内存空间

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

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

栈溢出

看两段代码:

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

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

段错误的调试_第1张图片

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

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

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

段错误的调试_第2张图片

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

gdb file_name core.*

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

段错误的调试_第3张图片

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




你可能感兴趣的:(linux学习)