给进程做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. 手动发送信号
如果程序未崩溃,可手动向进程发送 SIGQUIT
或 SIGABRT
信号来生成 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. 注意事项
- 权限:确保进程有权限在指定路径生成 coredump 文件。
- 空间:coredump 文件可能较大,注意磁盘空间。
- 保密性:coredump 文件可能包含敏感信息,妥善存储和处理。