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

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

-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值