segment fault 是段错误,通常在非法内存访问,读写的时候会报这个错误。
一、比较常见的错误情况如下
1:赋值操作(非法地址写)
2:数组越界 (非法地址读 或 写)
![](https://uploadfiles.nowcoder.com/images/20191008/471790007_1570519329020_8FCDF0ACD077AB4F46399AE2DD6A73CC)
相当于执行了putchar(a[3]),a[3]是"\0",在内存中是00,也是个常见的非法内存访问
3:内存(字符串)拷贝 (非法地址读 或 写)
4:非法地址执行(栈溢出,任意地址执行时可能出现这种情况)
![](https://uploadfiles.nowcoder.com/images/20191008/471790007_1570520265547_3BFA411F2FC402BA9314930D8E6BA529)
这条指令 == call 0xdeadbeef,0xdeadbeef 是个非法地址,所以会报段错误。
还有一些暂时想不起来的,不过原理也是非法内存访问和读写。
二、知道了错误的成因就可以知道怎么检测了。
1:printf 大法
最简单的往往是最常用的,printf一下地址,变量。
2:调试的方法
利用gdb, asan这些工具可以很快定位到segment fault的地址
是一个0地址写的seg fault
3:catchsegv 指令
是一个输出segfault 时寄存器的内容。
暂时想到这么多,写的东西也不是很深,其实段错误是很好检测的,因为一旦发生段错误,os就会请求中断或者发出信号来结束程序。要在编译时候检测,借助gcc+asan这种内存检查工具才可行,即便是asan也可能存在疏漏。windows下也有成熟独立的体系,原理相同就不多说了。