跳转至

给进程做coredump

给进程生成 coredump 通常是为了调试程序崩溃或异常行为。以下是常用的方法和步骤:


1. 检查和设置 coredump 大小限制

Linux 默认可能禁止生成 coredump,或者限制其大小为 0。可以通过以下命令检查和设置限制:

检查限制:

ulimit -c

输出为 0 表示 coredump 已被禁用。

设置限制:

ulimit -c unlimited

以上命令将 coredump 大小限制设为不限制。要使其对所有用户生效,可编辑 /etc/security/limits.conf 文件,添加类似以下内容:

* soft core unlimited
* hard core unlimited

2. 配置 coredump 文件保存路径

coredump 文件的保存路径由 core_pattern 控制。检查和配置方式如下:

检查当前配置:

cat /proc/sys/kernel/core_pattern

可能的值示例:

  • core:生成的 coredump 文件名为 core,存储在当前目录。
  • /tmp/core.%e.%p:生成的 coredump 文件存储在 /tmp,文件名包含程序名 (%e) 和进程号 (%p)。

修改配置:

编辑 /etc/sysctl.conf 或直接运行以下命令:

echo "/tmp/core.%e.%p" > /proc/sys/kernel/core_pattern

部分系统可能还需要确保 core_pattern 不依赖 systemd-coredump。可通过以下命令检查:

systemctl status systemd-coredump

如有必要,停止或禁用:

systemctl stop systemd-coredump
systemctl disable systemd-coredump

3. 触发 coredump

以下是几种常用触发方式:

1. 程序崩溃自动生成

确保程序未屏蔽 SIGSEGV 等信号,直接运行程序,在其崩溃时生成 coredump。

2. 手动发送信号

如果程序未崩溃,可手动向进程发送 SIGQUITSIGABRT 信号来生成 coredump:

kill -SIGQUIT <pid>
# 或
kill -SIGABRT <pid>

3. 使用 GDB 手动生成

使用 GDB 附加到进程并生成 coredump:

gdb -p <pid>
(gdb) generate-core-file
(gdb) detach
(gdb) quit

生成的 coredump 文件将存储在当前目录或指定路径。


4. 调试 coredump 文件

生成 coredump 后,可以使用 gdb 或其他调试工具加载和分析:

gdb <程序路径> <coredump文件路径>

进入 GDB 后,使用以下命令分析:

  • bt:查看堆栈信息。
  • info threads:查看线程信息。
  • list:查看崩溃代码位置。

5. 注意事项

  1. 权限:确保进程有权限在指定路径生成 coredump 文件。
  2. 空间:coredump 文件可能较大,注意磁盘空间。
  3. 保密性:coredump 文件可能包含敏感信息,妥善存储和处理。