一、什么是core文件?
在程序发现段错误等不寻常退出时,例如错误的内存操作等,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时调试信息,前提是编译时添加-g参数),之后使用gdb调试生成的core文件,来定位到导致程序崩溃的代码所在的具体位置。
二、linux环境配置支持可生成 core 文件
1、core文件开关
使用命令 ulimit -c 查看core开关,如果为0表示关闭,不会生成core文件;
使用命令 ulimit -c [filesize] 设置core文件大小;
使用命令 ulimit -c unlimited 设置core文件大小为不限制其大小;
注:通常使用 ulimit -c unlimited 不限制其大小,不过这中设置方式只是临时生效,若想永久生效,
可以通过在shell的启动脚本/etc/bashrc、~/.bashrc或者/etc/profile等地方来加入 ulimit -c unlimited 命令来指定每次开机启动就会执行设置。
vi /etc/profile,最后一行添加命令ulimit -c unlimited
之后通过命令ulimit -a 查看设置效果
2、设置更改core dump文件的生成路径
core文件有默认的名称和路径,为了调试方便,可以通过proc/sys/kernel/core_pattern 文件来控制core文件的生成位置以及文件的命名格式。
可通过以下命令来修改该文件:
echo “/var/core/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
该命令可以设置将生产的core文件统一保存到/var/core/目录下,产生的文件名为core-命令名-pid-时间戳
对应参数意义说明:
%p - insert pid into filename 插入当前的pid
%u - insert current uid into filename 插入当前的uid
%g - insert current gid into filename 插入当前的gid
%s - insert signal that caused the coredump into the filename 插入导致产生core文件的信号
%t - insert UNIX time that the coredump occurred into filename 插入core文件生成时的时间
%h - insert hostname where the coredump happened into filename 插入主机名
%e - insert coredumping executable name into filename 插入程序名
三、验证程序崩溃时生成的core文件以及core文件的调试方式
1、core文件生成
以我本地的一个测试demo为例说明:
简单写个内存错误操作代码:
记得编译时通过添加 -g 选项参数使程序生成可调试的信息:
2、通过gdb命令来调试生成的core文件
调试命令:gdb + 可执行程序 + core文件
gdb test core-test-11404-1636687970
然后执行bt看堆栈信息:
最后就可以定位到具体出错的行位置信息。