核心转储发生在Java本机方法中

问题描述

我的项目是一个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的堆栈:

Java core dump stack