背景
有时当我们在Linux下编程,程序运行时会出现以下提示:
Segmentation fault (core dumped)
然后,程序崩溃,退出运行。发生这一问题的原因往往是程序中指针不规范使用导致内存越界访问、堆栈溢出、多线程编程出错等问题。
这时,如果我们编译时在命令行加入 -g 选项,就会在出现上述错误时自动于当前目录生成core.xxxxxx文件,我们可以利用这一文件查询导致上述错误的代码位置。
介绍
core文件,又称核心文件、核心转储(core dump),是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。1
因此,当我们的程序因为编程时的“不小心”导致出现段地址错误时,就可以利用core文件信息进行错误查找,方便程序员及时修正。
使用
- 首先,要检查系统是否开启了core文件生成功能:
在终端输入以下命令:
ulimit -a
如果显示core file的size为0,说明没有开启core文件生成功能,输入以下命令开启:
ulimit -c ulimited
当然,也可以输入一个数字指定大小,但一般不建议,因为一旦文件写满可能会遗漏错误信息。
-
为gcc/g++命令增加 -g 调试选项
这样,当程序一旦发生上述错误时,就会生成core文件,将错误信息写入 -
core文件生成后,并不能直接打开,需要使用以下命令查看信息:
gdb ./out core.26591
./out为编译生成的可执行文件,core.26591要替换成可执行文件目录下对应的core文件文件名,执行后即可看到相应信息,追踪产生segmenttation fault的位置及对应函数调用情况:
输入以下命令行:
(gdb)> bt
可以查看发生段错误时进程具体执行到了函数的哪一行,以及每一个函数调用时传递的参数等信息,帮助程序员查错!