段错误(Segmentation fault)产生原因及调试
Oct 25, 2015
本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.
段错误
段错误是由内存管理单元的异常导致的, 这个异常通常是由于解引用一个未初始化的或非法的指针引起的, 此时程序尝试访问的内存位置并不允许程序去访问.
段错误产生原因
- 访问了不存在的内存地址
- 访问了系统保护的内存地址(解引用一个空指针)
- 向制度的内存地址写入信息
- 用完堆或者栈空间
1 | # test.c 访问系统保护的内存地址引发段错误 |
段错误调式方法
使用gdb调试程序, 在gcc编译时加入-g参数
1 | $ gcc -g test.c -o test |
Tips:
1 | # gdb安装方法 |
更详细的步骤可以查看Installing GDB on Mac OS X Yosemite
1 | # 运行一下命令进入gdb调式状态 |
可以达到触发了段错误, 并提示地址为0x0000000100000f90
1 | # 退出gdb |
gdb错误解决方案
可能产生一下错误
1 | Unable to find Mach task port for process-id 92788: (os/kern) failure (0x5). |
最简单的解决方案是重启Mac