本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

段错误

段错误是由内存管理单元异常导致的, 这个异常通常是由于解引用一个未初始化的或非法的指针引起的, 此时程序尝试访问的内存位置并不允许程序去访问.

段错误产生原因

  • 访问了不存在的内存地址
  • 访问了系统保护的内存地址(解引用一个空指针)
  • 向制度的内存地址写入信息
  • 用完堆或者栈空间
1
2
3
4
5
6
7
8
9
10
# test.c 访问系统保护的内存地址引发段错误
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
int* ptr = (int*)0;
*ptr = 100;
return 0;
}

段错误调式方法

使用gdb调试程序, 在gcc编译时加入-g参数

1
$ gcc -g test.c -o test

Tips:

1
2
# gdb安装方法
$ brew install homebrew/dupes/gdb

更详细的步骤可以查看Installing GDB on Mac OS X Yosemite

1
2
3
4
5
6
# 运行一下命令进入gdb调式状态
$ gdb test
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x0000000100000f90 in main (argc=1, argv=0x7fff5fbff318) at test.c:6
6 *ptr = 100;

可以达到触发了段错误, 并提示地址为0x0000000100000f90

1
2
# 退出gdb
(gdb) quit

gdb错误解决方案

可能产生一下错误

1
2
Unable to find Mach task port for process-id 92788: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))

最简单的解决方案是重启Mac

参考链接