问题描述
我的项目是一个Spring Boot项目,并在K8s pod中运行。遇到错误,这是日志文件的标题:
# A Fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f116f6b1be1,pid=516,tid=0x00007f10795ef700
#
# JRE version: OpenJDK Runtime Environment (8.0_121-b13) (build 1.8.0_121-8u121-b13-0ubuntu1.16.04.2-b13)
# Java VM: OpenJDK 64-Bit Server VM
# Problematic frame:
# C [libc.so.6+0x95bd3] strchrnul+0x23
#
# Core dump written. Default location: /projects/core.dump
然后我尝试获取文件core.dump,其大小为 5G 。我的项目通过.so文件调用了C本机方法,该方法不包含方法main
,因此我无法编译以获取.exe
或.out
。尝试这些方法后,我不知道如何分析转储文件:
gdb [exe file] [core file](can get the exe file)
gdb java core.dump
jmap -dump:format=b,file=./2842.hprof $JAVA_HOME/bin/java core.dump
如何分析core.dump定位问题?
解决方法
假设您在Windows中,则可以使用WinDbg轻松调试转储。您可以尝试WinDbg预览-我正在用它来调试Java核心转储。 您可以在这里https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools
下载它然后只需将!analyze -v
作为第一个命令运行,您将获得许多有用的信息。我有40G转储,所以5G应该没问题。
当然,您必须选择合适的螺纹,例如这是我的线程java.exe!main
的堆栈: