Java 从核心转储中提取堆转储(hprof)

Java 从核心转储中提取堆转储(hprof),java,jvm,coredump,jvm-hotspot,heap-dump,Java,Jvm,Coredump,Jvm Hotspot,Heap Dump,目前我有一个核心转储文件,我想提取堆转储。无论我尝试了什么,我总是会收到以下错误消息: god@heaven:~$ sudo /opt/java-MyApp/bin/jmap -dump:format=b,file=my-file.hprof /opt/java-MyApp/bin/java /home/god/tmp/core [sudo] password for god: Attaching to core /home/god/tmp/my-app-core-dump from exec

目前我有一个核心转储文件,我想提取堆转储。无论我尝试了什么,我总是会收到以下错误消息:

god@heaven:~$ sudo /opt/java-MyApp/bin/jmap -dump:format=b,file=my-file.hprof /opt/java-MyApp/bin/java /home/god/tmp/core
[sudo] password for god: 
Attaching to core /home/god/tmp/my-app-core-dump from executable /opt/java-MyApp/bin/java, please wait...
Error attaching to core file: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
sun.jvm.hotspot.debugger.DebuggerException: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
    at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:411)
    at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
    at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
    at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
    at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:83)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.tools.jmap.JMap.runTool(JMap.java:201)
    at sun.tools.jmap.JMap.main(JMap.java:130)
如果我尝试用gdb打开核心,它就像一个符咒:

gdb --core core
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
[New LWP 11241]
[New LWP 11242]
[New LWP 11243]
[New LWP 11244]
[New LWP 11245]
...
[New LWP 23423]
[New LWP 30560]
[New LWP 11240]
Core was generated by `/opt/java-MyApp/bin/java -Djava.util.logging.config.file=/opt/MyAp'.
#0  0x0000003c838cc0a6 in ?? ()
[Current thread is 1 (LWP 11241)]
(gdb) 

有什么我遗漏的吗?为什么我总是收到“远程进程中找不到符号”gHotSpotVMTypes“的错误消息?

问题相当简单。
/opt/java MyApp/bin/java
路径是一个
symlink
,一旦我重新创建了用于生成核心转储的机器上的结构,它就会像一个符咒一样工作。这些库似乎是按其规范路径使用的。

在gdb下,你能找到
gHotSpotVMTypes
symbol吗?不是所有的OpenJDK版本吗?或者我可以检查什么?在gdbI get下键入
p gHotSpotVMTypes
:未加载符号表。使用“file”命令。如果我执行了
(gdb)file~/Apps/jdk1.8.0\u 102/bin/java
我将从~/Apps/jdk1.8.0\u 102/bin/java中读取符号。完成。
sudo $JVM_USED_WHILE_GCORE_HOME/bin/jmap -dump:format=b,file=$OUTPUT_HPROF_FILE $JVM_USED_WHILE_GCORE_HOME/bin/java $CORE_FILE_PATH