core文件的产生与调试

在linux系统下运行程序,假如程序崩溃,则当前目录下将出现一个名为core...的文件,记录崩溃的相关信息。

目录

core的产生标志

编译

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 

调试

按照下图输入指令,完成编译。然后运行可执行文件,返回“段错误”。

core文件的产生与调试_第1张图片

运行后,执行ls命令,你将看到core.XXXX文件,其中XXXX是进程号。

执行如下命令,追踪到具体的崩溃位置(下图红线指示了各步操作):

gdb  ./main.out
core-file core.XXXX
bt

core文件的产生与调试_第2张图片

 

你可能感兴趣的:(Linux,gcc/gdb编译调试)