在生产环境中,一般情况下不会打开core文件开关,所以如果进程运行过程中core掉了,就无法找到程序的调用栈,而且此时日志文件中也没有记录core掉的原因,那么此时如何找出程序是core在哪行代码呢 ?笔者在工作中就遇到过这样一个问题。
1. 现场分析
现场有用的信息中,应用程序日志中没有记录任何有用信息,只是在/var/log/messages中记录了程序core的一段信息如下:
2021-12-04T16:46:07.584931+08:00|info|kernel[-]|[28775921.634699] WorkerThd[48892]: segfault at 0 ip 00007fc8ae0c41d9
sp 00007fc8787dd500 error 4 in libjemalloc.so[7fc8ae06a000+95000]
这里介绍一下/var/log/messages这个文件, messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在 messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。
从现场信息中,我们可以分析出程序core的原因:
- WorkerThd:线程名
- 48892:线程ID
- segfault at 0:表示线程访问这个空地址时出现错误,即空指针异常
- ip 00007fc8ae