使用 gcore 进行的核心转储,将 jmap 转换为 hprof 文件格式失败,并显示错误消息

2022-09-02 22:10:48

我们最近遇到了一个JVM崩溃,留下了一个由gcore命令生成的核心转储文件。我们想看看文件的内容,并找出导致崩溃的确切原因。

使用该命令,您应该能够将核心转储文件转换为hprof文件格式的文件,然后可以使用VisualVM和许多其他工具对其进行分析。我已经尝试过这个,并收到一条错误消息。这是我运行的命令(在发生崩溃的同一个盒子上,使用相同的JVM):jmap

jmap -dump:format=b,file=dump.hprof /usr/java/jdk1.6.0_16/bin/java core.dump.2878

整个回应是:

> Attaching to core core.dump.8483 from executable /usr/java/jdk1.6.0_16/bin/java, please wait...
> Error attaching to core file: Can't attach to the core file

这不是一个非常有用的错误消息。我想知道这是否是权限问题,但是我收到运行命令的消息与运行导致核心转储的JVM的相同用途相同。我也想知道核心文件是否损坏,所以我决定使用,看看我是否可以打开核心文件,看看里面有什么。这是我得到的:gdb

> gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5_7.1)
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) core-file core.dump.8483
[New Thread 2889]
[New Thread 2893]
[New Thread 2894]
[New Thread 2895]
[New Thread 2896]
[New Thread 2904]
[New Thread 2915]
[New Thread 2916]
[New Thread 2917]
[New Thread 2921]
[New Thread 2922]
[New Thread 3175]
[New Thread 3239]
[New Thread 3252]
[New Thread 3258]
[New Thread 3260]
[New Thread 3356]
[New Thread 3509]
[New Thread 3510]
[New Thread 3514]
[New Thread 3523]
[New Thread 3541]
[New Thread 3542]
[New Thread 3543]
[New Thread 4022]
[New Thread 4057]
[New Thread 4058]
[New Thread 4077]
[New Thread 4078]
[New Thread 4079]
[New Thread 4080]
[New Thread 6128]
[New Thread 6140]
[New Thread 6162]
[New Thread 6376]
[New Thread 6389]
[New Thread 6408]
[New Thread 6422]
[New Thread 6429]
[New Thread 6451]
[New Thread 6497]
[New Thread 6513]
[New Thread 6514]
[New Thread 6516]
[New Thread 6517]
[New Thread 6532]
[New Thread 6533]
[New Thread 6665]
[New Thread 6675]
[New Thread 6676]
[New Thread 6687]
[New Thread 6689]
[New Thread 6692]
[New Thread 6706]
[New Thread 6707]
[New Thread 6735]
[New Thread 6736]
[New Thread 7033]
[New Thread 7034]
[New Thread 7056]
[New Thread 7077]
[New Thread 7079]
[New Thread 7080]
[New Thread 7082]
[New Thread 7089]
[New Thread 7090]
[New Thread 7091]
[New Thread 7092]
[New Thread 7103]
[New Thread 7105]
[New Thread 7107]
[New Thread 7108]
[New Thread 7116]
[New Thread 7229]
[New Thread 7308]
[New Thread 7493]
[New Thread 7505]
[New Thread 7510]
[New Thread 7511]
[New Thread 7517]
[New Thread 7523]
[New Thread 7604]
[New Thread 7617]
[New Thread 7618]
[New Thread 7619]
[New Thread 8676]
[New Thread 8693]
[New Thread 8700]
[New Thread 8851]
[New Thread 8860]
[New Thread 8887]
[New Thread 9007]
[New Thread 9118]
[New Thread 9119]
[New Thread 9120]
[New Thread 9413]
[New Thread 9427]
[New Thread 9495]
[New Thread 9508]
[New Thread 9519]
[New Thread 9535]
[New Thread 9536]
[New Thread 9537]
[New Thread 9554]
[New Thread 9556]
[New Thread 9659]
[New Thread 9660]
[New Thread 9663]
[New Thread 9664]
[New Thread 9665]
[New Thread 9666]
[New Thread 9667]
[New Thread 9668]
[New Thread 9669]
[New Thread 9670]
[New Thread 9671]
[New Thread 9678]
[New Thread 9870]
[New Thread 9953]
[New Thread 9998]
[New Thread 10002]
[New Thread 10118]
[New Thread 10119]
[New Thread 10122]
[New Thread 10149]
[New Thread 10152]
[New Thread 10155]
[New Thread 10176]
[New Thread 10178]
[New Thread 10179]
[New Thread 10180]
[New Thread 10182]
[New Thread 10194]
[New Thread 10195]
[New Thread 10196]
[New Thread 10198]
[New Thread 10199]
[New Thread 10200]
[New Thread 10201]
[New Thread 10202]
[New Thread 10203]
[New Thread 10205]
[New Thread 10206]
[New Thread 10244]
[New Thread 10246]
[New Thread 10247]
[New Thread 10248]
[New Thread 10249]
[New Thread 10251]
[New Thread 10252]
[New Thread 10254]
[New Thread 10255]
[New Thread 10256]
[New Thread 10257]
[New Thread 10258]
[New Thread 10259]
[New Thread 10260]
[New Thread 10261]
[New Thread 10262]
[New Thread 10263]
[New Thread 10264]
[New Thread 10265]
[New Thread 10267]
[New Thread 10268]
[New Thread 10269]
[New Thread 10271]
[New Thread 10476]
[New Thread 10477]
[New Thread 10479]
[New Thread 10552]
[New Thread 10607]
[New Thread 10611]
[New Thread 10612]
[New Thread 10613]
[New Thread 10615]
[New Thread 10617]
[New Thread 10623]
[New Thread 10624]
[New Thread 10625]
[New Thread 10641]
[New Thread 10642]
[New Thread 10649]
[New Thread 10736]
[New Thread 10742]
[New Thread 10756]
[New Thread 10758]
[New Thread 10760]
[New Thread 10761]
[New Thread 10762]
[New Thread 11278]
[New Thread 11412]
[New Thread 11513]
[New Thread 11514]
[New Thread 2878]
(gdb) quit

在这一点上,我退出了,因为我对如何用它来诊断这类问题一无所知。我甚至不明白最后一个命令是做什么的。值得注意的是,输出中正好有134个“新线程”行,如果每个行都代表JVM中生成的一个新线程,这可能是JVM死亡的原因。gbd

所以我的问题实际上是三重的——

1)任何想法,为什么命令可能给出了该错误消息?jmap

2)任何想法输出意味着什么?gdb

3)任何想法如何使用来进一步诊断这个问题?gdb


答案 1

顺便说一句,jvisualvm可以直接加载核心转储。但是,您必须使用创建核心文件的相同 jvm。


答案 2

这让我很烦恼,因为我有一个核心文件,它代表了我需要分析的堆,但我经常看到下面的异常消息:

sun.jvm.hotspot.debugger.NoSuchSymbolException:在任何已知的库名称(libjvm.so、libjvm_g.so、gamma_g)中找不到符号“gHotSpotVMTypeEntryTypeOffset”

将 jre 从我的源计算机(获取核心文件的计算机)复制到目标计算机中完全相同的文件夹中,然后使用该 java 位置作为参数运行 jmap 对我有用。

因此,以下是在其他人遇到此问题时要尝试的步骤:
1.通过gdb连接到核心文件,并确认正在运行的进程正在使用的java二进制文件的位置:

    gdb --core=</path/to/core-file>

2.上面的输出将以类似

[New Thread 22748]
**Core was generated by `/opt/blah/location/jre/bin/java -Xmx...'.**

3. 确保将 jre 的匹配版本复制到 /opt/blah/location/ 目录中

  1. 然后启动 jmap 作为:

    /opt/jdk1.8.0_09/bin/jmap -heap /opt/blah/location/jre/bin/java /path/to/core-file
    

    这应该成功连接到核心文件并打印出堆统计信息。如果是这样,则表示您已成功读取核心文件

  2. 从那时起,您可以使用以下命令从核心文件成功生成 hprof:

    /opt/jdk1.8.0_09/bin/jmap -dump:format=b,file=my-file.hprof /opt/blah/location/jre/bin/java /path/to/core-file
    

推荐