Extracting Heap-dump (hprof) from Core-dump
Asked Answered
J

1

7

Currently I have a core-dump file and I would like to extract the heap-dump. Whatever I tried I always get the following error message:

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)

If I try to open the core with gdb, it works like a charm:

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) 

From all stuff I have read, I should be sure to have the JVM installed on same path and version I had when core dump was done using {{gcore}}. Being done that all I need to do is call jmpa witht that exact jvm:

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

Is there something I'm missing? Why do I constatly get the "could not find symbol "gHotSpotVMTypes" in remote process" error message?

Johppah answered 20/1, 2017 at 7:27 Comment(7)
Under gdb, can you find gHotSpotVMTypes symbol?Avaavadavat
aren't all OpenJDK versions? Or what may I check?Johppah
Type p gHotSpotVMTypes under gdbAvaavadavat
I get: No symbol table is loaded. Use the "file" command.Johppah
And if I do (gdb) file ~/Apps/jdk1.8.0_102/bin/java I get Reading symbols from ~/Apps/jdk1.8.0_102/bin/java...(no debugging symbols found)...done.Johppah
gHotSpotVMTypes symbol is defined in libjvm.so (not in java launcher). It looks like libjvm.so referenced in coredump is missing or does not match the local version.Avaavadavat
@Avaavadavat thanks, you lead me to the right direction, the problem was basically that java was being referred by a symlink, once I created the symlink locally I could extract the heapdump.Johppah
J
5

The problem was fairly simple. The /opt/java-MyApp/bin/java path was a symlink, once I re-created the structure as I had on the machine used to generate the core-dump it worked like a charm. It seems the libraries are used by its canonical path.

Johppah answered 20/1, 2017 at 12:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.