2017-01-20 15 views
2

В настоящее время у меня есть файл дампа ядра, и я хотел бы извлечь кучу-дамп. Что бы я ни старался, я всегда получаю следующее сообщение об ошибке:Извлечение кучи-дампа (hprof) из ядра-дампа

[email protected]:~$ 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) 

Из всех вещей, которые я прочитал, я должен убедитесь, что JVM установлен на том же пути и версии, которые были у меня, когда ядро ​​дампа было выполнено с помощью {{gcore}}. Выполнение этого всего, что мне нужно сделать, это вызвать jmpa с этим точным 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 

Есть ли что-то, что мне не хватает? Почему я постоянно получаю сообщение об ошибке «не могу найти символ» gHotSpotVMTypes «в удаленном процессе»?

+0

Под gdb вы можете найти символ 'gHotSpotVMTypes'? – apangin

+0

не все версии OpenJDK? Или что я могу проверить? –

+0

Тип 'p gHotSpotVMTypes' под gdb – apangin

ответ

1

Проблема была довольно простой. Путь /opt/java-MyApp/bin/java был symlink, как только я заново создал структуру, как я был на машине, используемой для создания ядра-дампа, который он работал, как шарм. Кажется, что библиотеки используются по каноническому пути.

 Смежные вопросы

  • Нет связанных вопросов^_^