Linux环境中以daemon方式运行的程序生成core dump

本文详细介绍了在Linux环境下,如何针对以daemon方式运行的程序进行核心转储配置,确保在程序意外终止时能够生成核心转储文件。通过在/etc/profile中设置ulimit-cunlimited和修改/proc/sys/kernel/core_pattern文件,实现核心转储文件的绝对路径存储,以避免因进程工作目录权限问题导致的核心转储失败。同时提供了测试示例和核心转储文件格式详解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux环境中以daemon方式运行的程序生成core dump

  • 作者:柳大·Poechant(钟超)
  • 邮箱:zhongchao.ustc#gmail.com(# -> @)
  • 博客:Blog.CSDN.net/Poechant
  • 日期:June 30th, 2012

1 精要

  1. /etc/profile中添加:
      ulimit -c unlimited > /dev/null 2?&1
    
  2. 修改/proc/sys/kernel/core_pattern文件中的 core dump 文件格式为绝对路径,比如:
      /data/coredump/core-%e-%p-%t
    

    注意/proc/sys/kernel/core_pattern的修改方式是:

      poechant@dev:~$ su
      Password:
      root@dev:/# echo `/data/coredump/core-%e-%p-%t` > /proc/sys/kernel/core_pattern
    

2 详解

一般在 CLI 上启动的程序,如果设置:

ulimit -c unlimited

就可以在程序以外终止时生成 core dump 文件。但是对于 daemon 方式运行的程序,其与 CLI 启动的程序的主要区别是进程的运行环境,其中就包括 cwd(current working directory)。如果以相对路径方式定义 core 文件的格式,比如定义 /proc/sys/kernel/core_pattern 为:

core-%e-%p-%t

则一般来说,daemon 文件的 cwd 就是/,你可以通过/proc/<your_program_pid>/cwd来查看,一般都是连接到/目录。而如果用户对这个目录没有写权限,那么就不会生成 core dump 文件了。

最直接的解决的方法,是修改/proc/sys/kernel/core_pattern为绝对路径:

/data/coredump/core-%e-%p-%t

并且保证这样就基本 OK 了。你可以通过程序来测试一下。两种简单的方式是:

2.1 两个测试小例子

2.1.1 W1S 方式 (While-1-Sleep)

编写一个简单的程序如下:

#include <unistd.h>
int main() {
    while (1) {
        sleep(1);
    }
    return 0;
}

编译运行后使用如下命令让程序生成 core dump 文件:

kill -ABRT <program_pid>

-ABRT也可以用-6,都是表示abort信号。或者利用 GDB:

gdb -p <program_pid>
(gdb) gcore <core_filename>
Saved corefile <core_filename>

也可以生成 core dump 文件。

2.1.2 故意产生一个 segment fault
int main(void) {
    int* p = NULL;
    delete p;
}

编译运行就会被终止生成 core dump 文件。

以上两种方式,core dump 文件应该都是按照你设定的/proc/sys/kernel/core_pattern来生成的。

2.2 core_pattern 格式详解

%%  A single % character
%p  PID of dumped process
%u  real UID of dumped process
%g  real GID of dumped process
%s  number of signal causing dump
%t  time of dump (seconds since 0:00h, 1 Jan 1970)
%h  hostname (same asnodenamereturned by uname(2))
%e  executable filename

2.3 core_uses_pid 作用

/proc/sys/kernel/core_pattern中未定义%p时,/proc/sys/kernel/core_uses_pid文件中定义是否在 core dump 文件名后追加进程ID.PID

  echo 1 > /proc/sys/kernel/core_uses_pid   使得 core文件名后包含   .PID
  echo 0 > /proc/sys/kernel/core_uses_pid   使得core文件名后不包含 .PID

3 Reference

  1. http://blog.csdn.net/iterzebra/article/details/6205848

-

转载请注明来自柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant

-

`coredump.conf` 文件用于配置 systemd 管理的核心转储(core dump)行为。从较新的 Linux 发行版开始,systemd 提供了一种更现代化的方式来管理核心转储,默认情况下它会收集并存储这些转储文件,并提供额外的功能如压缩、大小限制等。 以下是 `coredump.conf` 中一些常用配置项及其含义: 1. **Storage**: - 控制核心转储数据的存储位置。 - 可选值有 `"none"`(不保存)、`"external"`(外部文件,通常是 `/var/lib/systemd/coredump/` 目录下的文件)、`"journal"`(记录到 journal 日志中)。默认是 `"external"`。 2. **MaxUse**, **MaxFileSize** 和 **KeepFree**: - 这些选项用来控制磁盘使用的总量 (`MaxUse`)、单个核心转储文件的最大尺寸 (`MaxFileSize`) 以及保持空闲的空间量 (`KeepFree`)。 - 单位可以用字节表示,也可以用人类易读的形式如 "K", "M", "G" 表示千字节、兆字节或吉字节。 3. **Compress**: - 启用与否会对核心转储文件进行 gzip 压缩以节省空间。接受布尔值(true 或 false),默认为启用状态。 4. **ProcessSizeMax**: - 设置一个进程占用内存超过多少时不再生成核心转储文件。这对于防止过大的 core 文件消耗过多资源很有帮助。 5. **Exclude**: - 列表形式列出不想为其生成核心转储的服务名称或者二进制文件名。 6. **AnonymousWriter**: - 允许匿名用户提交核心转储报告给开发者或其他服务端点(如果启用了此功能的话)。 7. **LogLevel**: - 定义日志级别,决定了哪些级别的消息会被记录下来。比如 debug, info, notice, warning, err 等。 为了应用更改后的设置,你需要重启系统或者是重新加载 systemd 的配置(可以尝试运行 `sudo systemctl daemon-reload`)。 ### 示例配置 ```ini [DEFAULT] # 存储方式设为 external 并启用压缩 Storage=external Compress=true # 设定最大使用磁盘空间为 2GB ,保留至少 1GB 自由空间 MaxUse=2G KeepFree=1G # 对于每个核心转储文件,其最大体积不超过 512MB MaxFileSize=512M # 排除某些特定应用程序的核心转储 Exclude=[ "/usr/bin/myapp", "myservice.service" ] ``` 记得根据实际需求调整这些参数!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值