无法产生coredump的问题

我写了一个必然会崩溃的程序,名字为 test
#include "stdlib.h"
#include "unistd.h"

int main()
{

        char *pTest = NULL;
        memcpy(pTest , "123", 111); 
        return 0;
}


编译后,直接执行,会在当前目录产生coredump

然后我又写了一个shell,名字为 shelltest.sh :
#!/bin/bash

ulimit -c unlimited
echo $(date) 'aaaa' >> /root/oooo.log
echo $(ulimit -a)    >> /root/oooo.log
sleep 3
./test


并且在/etc/inittab中加入:(shelltest.sh , test 都放在/root)
asd:2345:respawn:/root/shelltest.sh

执行init q.这时脚本开始循环跑了,并且记了日志,程序也是在循环地崩溃。
在日志中打出来的ulimit -a如下:
core file size (blocks, -c) unlimited 
data seg size (kbytes, -d) unlimited 
scheduling priority (-e) 0 
file size (blocks, -f) unlimited 
pending signals (-i) 40960 
max locked memory (kbytes, -l) 32 
max memory size (kbytes, -m) unlimited 
open files (-n) 1024 pipe size (512 bytes, -p) 8 
POSIX message queues (bytes, -q) 819200 r
eal-time priority (-r) 0 
stack size (kbytes, -s) 10240 
cpu time (seconds, -t) unlimited 
max user processes (-u) 40960 
virtual memory (kbytes, -v) unlimited 
file locks (-x) unlimited

跟我在命令行中打出来的一致。似乎没什么不妥的地方。

但是在/root目录下没有产生dump文件。
问题用一句话描述就是:通过shell执行的程序崩溃了,为什么不产生coredump呢?

 

 

分析:

我上面的方法,其实也是可以产生coredump的,只是由于目录未设置,产生路径为 /proc/[pid]/cwdcurrent working directory)对应的目录,如图:

图中的cwd “/”,那么coredump需要到”/”下找。

同时要满足产生core的条件:

1.    core file size

2.    目录写权限

 

在下列条件下不产生core文件:
( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;
( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;
( c )用户没有写当前工作目录的许可权;
( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。

 


并且在sshd中输入的ulimit -c unlimited ,在由init启的进程中并不生效,需要设置,可以在shell中设置

 

posted on 2013-08-27 09:26  solohac  阅读(1535)  评论(0编辑  收藏  举报

导航