我的core文件去哪了

      最近的一次分析问题的经历促使我写了这篇文章。

      最近写了一个程序,基于开源界有名的libevent框架设计了一个服务器程序,运行在CentOS 6.3上,性能倒是不错,但是程序总在运行一段时间后消失,日志随机停在一个位置上,通过查看操作系统的日志/var/log/messages,发现了下面的内容:

Oct 31 14:02:33 CutSreen kernel: screenshot[11211]: segfault at 18 ip 000000362de6a44b sp 00007fb802fa5b20 error 4 in libstdc++.so.6.0.13[362de00000+e8000]

      毫无疑问,自己的程序crash了,错误号是4,即表示非法的读访问。

      马上想到通过core文件来定位错误,但是却没有发现我的core文件,后来就从AUPE书中找到下面几行内容,说明了为什么有时不会有core文件:
( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;
( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;
( c )用户没有写当前工作目录的许可权;
( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读

      然后就一条条检查自己的环境,发现第3条不满足!/proc/[pid]/cwd显示的目录竟然是根目录(这么设置是由于我担心文件系统的去挂载影响程序运行),我的程序运行用户对根目录没有写权限,于是就这个目录设置为一个有写权限的目录,运行了一段时间后,core文件如期而至,问题点也找到了:程序中在多线程插入和删除STL的map时候忘记加锁了!

      唉,大意了!但是,终究还是通过拿到core文件解决了问题。然后为了确保内存方面的可靠,又使用valgrind对代码进行了一次动态分析,结果报告显示内存无泄露。程序运行了很久,一直保持稳定。

      希望自己的查错经历对大家分析问题有帮助!

你可能感兴趣的:(linux,dump,core,valgrind)