在linux系统下运行程序,假如程序崩溃,则当前目录下将出现一个名为core...的文件,记录崩溃的相关信息。
目录
core的产生标志
在命令行输入ulimit -a,假如打印的结果第一行(core file size) 返回值为0,则core文件不会生成。此时,程序员可以输入:
ulimit -c 1024
撰稿时,我注意到,当自己以sudo权限操作时,ulimt -c 指令可能失灵。解决办法是关掉当前命令行,重新开一个。
编译
在前一篇博客《首次gdb调试》中,我们看到产生的可执行文件编译时要有-g标志,否则bt命令难以回溯到具体的崩溃位置。同样,假如编译可执行文件时没有-g标志,core文件中也不能获取崩溃的具体信息。
g++ main.cpp -g -o main.out
core文件的命名
default情况下,core文件的名字就是core。但是如果程序中跑了多个进程,则程序员肯定希望每个进程都有自己的core文件,且能通过pid号来区分各个文件。此时,程序员可以通过如下命令,将每个进程的core文件后面加上进程pid来区别:
echo "1" > /proc/sys/kernel/core_uses_pid
假如界面反馈权限不够,则采用nano来编辑该文件:
sudo nano /proc/sys/kernel/core_uses_pid
调试
按照下图输入指令,完成编译。然后运行可执行文件,返回“段错误”。

运行后,执行ls命令,你将看到core.XXXX文件,其中XXXX是进程号。
执行如下命令,追踪到具体的崩溃位置(下图红线指示了各步操作):
gdb ./main.out
core-file core.XXXX
bt

本文详细介绍了在Linux系统中如何生成和利用core文件进行程序崩溃后的调试。包括设置core文件大小,确保编译时带有-g标志,以及通过修改内核参数使每个进程生成带pid的core文件。并通过实例演示了使用gdb读取core文件定位崩溃原因的过程。
4869

被折叠的 条评论
为什么被折叠?



