CoreDump学习记录

来源:互联网 发布:淘宝申诉海外代购小票 编辑:程序博客网 时间:2024/06/07 05:03

CoreDump基础知识,已经有比较完善的介绍,参照tenfyguo博客:详解CoreDump

http://blog.csdn.net/tenfyguo/article/details/8159176/


do_coredump流程详解:

http://blog.chinaunix.net/uid-28236237-id-5587544.html


这里我只做自己的理解与学习记录


1.发生环境,CoreDump是内核挂掉后产生的一个记录上下文环境的文件;

2.它生成的位置是由 /proc/sys/kernel/core_patten 决定的,默认为core,为了避免被覆盖,一般修改为/data/coredump/core-%e-%p;

3.本人接触到的coredump产生方式为SIGSEGV 信号导致,可以通过访问非法指针,手动创建出生成这个信号;

4.CoreDump 功能对应的内核函数位置是 kernel/fs/core_dump.c do_coredump函数;


问题已定位:

1. 主要问题出在一个debuggerd守护进程上面,debuggerd会在每次出发coredump的情况下会去/data/corefile/目录下查找core**文件个数,如果大于4个,就会给/proc/sys/kernel/core_pattern赋值为/dev/null。

2. 接下来还需要确认的东西。1) do_coredump流程 2) 如何修改debuggerd进程


有个问题很纠结:

问题:到底do_coredump的open操作是如何完成的?


695 这个打开文件的方式到底是什么? 查找资料(Web & man)说(O_CREAT | O_EXCL)这两个标志位同时存在时,open对应的文件如果存在就会报错,返回-1,而且我也自己尝试过了,确实如此;.

       O_EXCL Ensure that this call creates the file: if this flag is specified in conjunction with O_CREAT, and pathname already exists, then open() will fail.

但是coredump的机制不是如果文件存在就覆盖掉原有文件吗? 我也在do_coredump加了打印信息,695行的open函数就返回0,郁闷。

代码:fs/coredump.c

636         int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW |
637                  O_LARGEFILE | O_EXCL;
695             cprm.file = filp_open(cn.corename, open_flags, 0600);