Дамп ядра, генерируемый виртуальной машиной 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). Есть некоторые эксперименты с демпингом ядра пользователя.