段错误是指程序尝试访问一段不可访问的内存。
在类Unix系统中,当出现段错误时,系统发送信号量SIGSEGV给产生段错误的进程;在Windows系统中,系统会发送异常STATUS_ACCESS_VIOLATION给产生段错误的进程。
程序运行过程中能访问到的内存空间主要有栈和堆。栈存放了函数的本地变量,堆是程序运行过程中能够自由分配和使用的内存空间。产生段错误和栈、堆的访问密切相关。
产生段错误的原因主要有:
在Linux系统下,首先开启core dump
:
ulimit -c unlimited
然后执行段错误的程序:
./a.out
程序出现段错误后,会出现如下提示:
Segmentation fault (core dumped)
表明生成了core
文件,存放在/proc/sys/kernel/core_pattern
目录下,然后可以使用GDB进行调试。
$ gdb ./a.out core
用来查看文件出错的情况。
执行bt
命令可以查看段出错的过程中调用的函数,如:
#0 0x0000000000441337 in ReorderBySort::Reorder (this=<value optimized out>,
index_files=@0x7fff704326b0, order=ReorderBySort::ORIGIN)
at /usr/include/c++/4.3/bits/stl_vector.h:688
#1 0x00000000004424e7 in ReorderProcessor::Reorder (this=0x7fff704326b0)
at src/reorder.cpp:57
#2 0x00000000004458a9 in Reorder () at src/indexer.cc:396
#3 0x00000000004497ed in main (argc=3, argv=<value optimized out>) at src/indexer.cc:1169
调用顺序是
main -> Reorder -> ReorderProcessor::Reorder -> stl_vector.h
输入up
和down
可以在#0, #1, #2和#3
之间切换,输入list
查看源代码。
要准确定位到出现段错误的位置,还需要细细查看源代码。