Linux coredump
关于 coredump
在 Linux 下, 如果程序崩溃, OS 可以生成 core 文件保存当前的堆栈信息, 方便 debug.
一般生成 coredump 的原因包括了:
- 内存越界
- 非法指针
- 堆栈溢出
- 死锁
- 非法操作, 除零这种等等
coredump 文件 limit
主要是文件大小的限制, 因为一般 core 文件会比较大.
ulimit -c unlimited
永久设置, 需要修改 /etc/security/limits.conf 文件:
#* soft core 0
* soft core unlimited
在线上环境, 如果有 coredump 之后自动拉起的机制, 比较容易发生 core 文件堆满磁盘的情况, 需要注意.
coredump 文件的格式和路径
# 修改 /proc/sys/kernel/core_pattern
echo '%e.core.%p' > /proc/sys/kernel/core_pattern
参数 | 说明 |
---|---|
%% | 单个%字符 |
%p | dump进程的进程ID |
%u | dump进程的用户ID |
%g | dump进程的组ID |
%s | 导致core dump的信号 |
%t | core dump的时间 |
%h | 主机名 |
%e | 程序文件名 |
永久设置, 需要修改 /etc/sysctl.conf 配置文件并执行 sysctl -p.
# 增加一行
kernel.core_pattern = %e.core.%p
core 文件是否带 pid 由 /proc/sys/kernel/core_uses_pid 参数决定.
如果这个文件的内容被配置成 1, 那么即使 core_pattern 中没有设置 %p, 最后生成的 coredump 文件名仍会加上进程 ID.
永久设置, 修改 /etc/sysctl.conf 配置文件并执行 sysctl -p.
# 增加一行
kernel.core_uses_pid = 1