本文简述在linux中程序coredump时,如何配置生成coredump文件。
设置生成coredump文件大小
如果进程在运行期间发生奔溃,操作系统会为进程生成一个快照文件,这个文件就叫做 core dump。之后我们可以对 core dump 文件进行分析,弄清楚进程为什么会奔溃。
由于 core dump 文件会占据一定的磁盘空间,默认情况下,Linux 不允许生成 core dump 文件。例如,下面的命令显示,Linux 允许的最大 core dump 文件大小为 0:
$ ulimit -a | grep core
core file size (blocks, -c) 0
可以通过下面设置,允许 Linux 生成 core dump 文件:
$ sudo ulimit -c unlimited
注意到,若是普通用户,报错:ulimit: core file size: cannot modify limit: Operation not permitted
,
请修改配置文件/etc/security/limits.conf
后,重新登录:
* hard core unlimited
* soft core unlimited
通过查看ulimit -c
是否成功:
# ulimit -c
unlimited
若显示0
,则失败,查看/etc/profile
或.bashrc
中是否有 ulimit的设置,注释掉相关内容。
设置 coredump 文件路径
那么 core dump 会存放在哪个目录呢?这是由系统参数kernel.core_pattern决定的。
查看core_pattern位置,
cat /proc/sys/kernel/core_pattern
通过编辑
/etc/sysctl.conf
指定路径:
$ sudo vi /etc/sysctl.conf
kernel.core_pattern=/var/crash/%E.%p.%t.%s
$ sudo sysctl -p
core dump 的命名方式为%E.%p.%t.%s,它们的含义:
%E:程序文件的完整路径(路径中的/会被!替代)
%p:进程 ID
%t:进程奔溃的时间戳
%s:哪个信号让进程奔溃
设置文件夹
/var/crash
权限,让当前用户可以访问
sudo chmod 777 -R /var/crash
测试
编写如下c++程序:
#include <thread>
#include <chrono>
int main()
{
std::this_thread::sleep_for(std::chrono::hours(1)); // 休眠一个小时
return 0;
}
编译:
g++ -g -o test test.cpp
运行:
$ ./test&
[1] 3246442
杀死进程,产生core dump文件
kill -s SIGSEGV 3246442
查看文件加中
/var/crash
中是否生成文件:
# ls /var/crash/
!home!service!test.3306362.1661288457.11'
调试coredump
执行如下命令,对coredump进行调试
gdb $program_name $coredump_file
评论