linux进程挂死应该如何定位?

现象:
1、ps显示进程还在。
2、top显示进程占用cpu一直是0%。
3、proc里面显示进程状态为sleeping。
4、进程的main函数中的循环打印不再执行。
5、进程中的signal函数无法手动触发。
6、除了我自己需要的4个信号,其他信号都使用pthread_sigmask屏蔽了。
7、进程从运行到挂死的过程中,占用的内存没有持续增长,没有内存泄漏问题。
8、程序从启动到挂死时间为5小时左右。最长可以达到5天。

请大神指点迷津。

抱歉搞不定,坐等大神 出现 mark一下

这个提问问的很专业,抱歉我也解决不了....不过之前有看过这篇文章:

 https://blog.csdn.net/wujin8589/article/details/51758944

会不会是程序的问题。

服务器在Linux上运行,一般情况下不关闭掉会永久运行,现在的很多服务基本都是这样子在一直跑着。

前面5条显示的是,进程已经休眠掉了,并且信号可能被系统调用到了。
有没有可能是定义的某些信号的名字,跟系统的sleep类定义的信号命名冲突了。

写的脚本有问题吧,系统不会说谎。

按照@hu_belif推荐的方法,拿到了当时的堆栈。但是信息很少,应该是栈被写坏了。估计是某一个数组越界,或者malloc的内存越界导致。大家帮忙看看!

Program terminated with signal 11, Segmentation fault.
#0 0x36c30504 in ?? () from /lib/libc.so.6
(gdb) bt
#0 0x36c30504 in ?? () from /lib/libc.so.6
#1 0x36be2938 in ?? () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

现在挂死问题已经不再出现了,初步定位是打印了太多的log,大量的sqlite占用CPU IO太高(最高达到50%以上)。CPU被耗尽时,原本有序的signal的处理不再有序,导致进程挂死。