本文简述在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

参考