前言
相信有不少小伙伴在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信号的一般区别如下:
- SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
- SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
定位错误方法:
gdb打印消息如下:0x00000000 in ?? ()基本可以确定是踩内存。
踩内存:访问了本不应该预期内的内存,因而导致出错。
可能出现的场景:
1、访问越界数组
2、访问已经被释放(被free)掉的内存