本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.
段错误
段错误是由内存管理单元的异常导致的, 这个异常通常是由于解引用一个未初始化的或非法的指针引起的, 此时程序尝试访问的内存位置并不允许程序去访问.
段错误产生原因
- 访问了不存在的内存地址
- 访问了系统保护的内存地址(解引用一个空指针)
- 向制度的内存地址写入信息
- 用完堆或者栈空间
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参数
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
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
参考链接