关于程序运行后出现Segmentation fault (core dumped)问题探讨

前言

相信有不少小伙伴在Linux下进行程序运行时,曾遇到过Segmentation fault(段错误)的问题:
在这里插入图片描述


一、Segmentation fault (core dumped)是什么?

Segmentation fault (core dumped)多为内存不当操作造成。core dumped就是核心转储。进程异常终止,进程用户空间的数据就会被写到磁盘(linux下一般不会产生core文件)。空指针、野指针的读写操作,数组越界访问,破坏常量等都可能导致。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。当然,排除此问题的最好办法则是调试。

二、调试步骤

1.输入命令行:ulimit -a

在这里插入图片描述
core file size 表示core文件的大小是0字节,所以,是默认不产生core文件的。
改变core file size让它产生core文件。

2.输入命令行:ulimit -c 1024

在这里插入图片描述
再次输入:ulimit -a 可以看到 core file size变为1024

3.再次运行程序后输入命令行 ll 进行查看

在这里插入图片描述
可以看到有个core文件生成,根据core文件查看错误原因

4.利用gdb调试:gdb corefile <core文件名>

在这里插入图片描述
可见:Program terminated with signal SIGSEGV, Segmentation fault。

关于SIGSEGV信号错误及错误定位方法

SIGBUS与SIGSEGV信号的一般区别如下:

  1. SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
  2. SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

定位错误方法:

gdb打印消息如下:0x00000000 in ?? ()基本可以确定是踩内存。
踩内存:访问了本不应该预期内的内存,因而导致出错。
可能出现的场景:
1、访问越界数组
2、访问已经被释放(被free)掉的内存

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉牛奶糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值