最近朋友项目发生了一件怪事,好好的进程,没有任何痕迹地退出,没有core文件,没有syslog痕迹,也不是进程主动退出,因为逻辑中exit都有日志。
现在记录一下追查过程:
1.先排除core生成条件不足的可能性
1)查看ulimit -c,
2)查看/proc/sys/kernel/core_pattern,
3)查看/etc/sysctl.conf中的
kernel.core_pattern = /var/core/core_%e_%p_%t
kernel.core_uses_pid = 0
这些设置都正常
2.排除程序自身exit
排查代码发现所有exit的地方都有日志,而现在进程退出没有任何exit相关的日志
3.查看syslog
在进程退出时间先后查看syslog没有发现任何异常
4.排除主动调用kill
查看机器的history,并没有发现有人调用过kill
从上面的结果看,应该是进程主动退出,但是并非是程序中的exit,那么大概率只有一种可能是进程收到了某种信号,然后导致进程退出。其实kill本身也是信号。那么怎么追踪呢?祭出大杀器:gdb,进程退出,最后应该会进入exit接口处理收尾工作。那就gdb在exit函数这里打断点,同时因为不可能直接在终端开着gdb,如果终端断开的话就会终止gdb监控,而本身这个异常退出就是不定时的,所以必须是后台模式启动gdb。
最关键的操作如下:
1.生成一个gdb脚本文件:monitor

本文介绍了一个进程无故退出的问题排查过程,最终通过gdb监控发现是由于未处理SIGPIPE信号导致进程异常终止。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



