Дамп ядра, генерируемый виртуальной машиной J9 в Linux, показывает / содержит только один поток

В чем причина дампа ядра, генерируемого виртуальной машиной J9 на платформе Linux, он просто показывает / содержит только один поток (то есть текущий поток)?

Примечание: это полный дамп ядра (не усеченный).

(gdb) info threads
* 1 Thread 0x7f33544d9700 (LWP 6471)  0x00007f335484d6e4 in j9dump_create () from ./app/was/IBM/WebSphere/AppServer/java/jre/lib/amd64/compressedrefs/libj9prt24.so

1 ответ

Решение

Это по замыслу (выделено жирным шрифтом ниже):

Linux не предоставляет API операционной системы для создания системного дампа из запущенного процесса. JVM создает системные дампы в Linux с помощью API fork () для запуска процесса, идентичного родительскому процессу JVM. Затем JVM генерирует сигнал SIGSEGV в дочернем процессе. Сигнал SIGSEGV заставляет Linux создать системный дамп для дочернего процесса. Родительская JVM обрабатывает и переименовывает системный дамп, как требуется, с помощью параметров -Xdump и может добавить дополнительные данные в файл дампа.

Системный дамп для дочернего процесса содержит точную копию областей памяти, используемых в родительском процессе. Средство просмотра дампа SDK может получить информацию о потоках Java, классах и куче из системного дампа. Однако средство просмотра дампа [gdb] и другие отладчики системного дампа показывают только один собственный поток, который выполнялся в дочернем процессе.

Если вы хотите, чтобы все темы, вы можете использовать gcore ${PID} или -Xdump: инструмент ловко и выполнить gcore %pid,

IBM предложила API ядра для создания дампа ядра, но он был отклонен по соображениям безопасности (DoS). Есть некоторые эксперименты с демпингом ядра пользователя.

Другие вопросы по тегам