Linux平台上 J9 VM 生成核心转储的原因是什么,它只显示/只包含一个线程(即当前线程)?
注意:它是完整的核心转储(未截断)。
(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
答案 0 :(得分:3)
这是by design(下面的粗体):
Linux不提供用于从正在运行的进程生成系统转储的操作系统API。 JVM使用fork()API在Linux上生成系统转储,以启动与父JVM进程相同的进程。然后,JVM在子进程中生成SIGSEGV信号。 SIGSEGV信号使Linux为子进程创建系统转储。父JVM根据需要通过-Xdump选项处理和重命名系统转储,并可能将其他数据添加到转储文件中。
子进程的系统转储包含父进程中使用的内存区域的精确副本。 SDK转储查看器可以从系统转储中获取有关Java线程,类和堆的信息。但是,转储查看器[gdb]和其他系统转储调试程序仅显示在子进程中运行的单个本机线程。
如果您想要所有主题,可以巧妙地使用gcore ${PID}
或-Xdump:tool并执行gcore %pid
。
IBM proposed a kernel API to create a core dump但出于安全原因(DoS)被拒绝。用户土地核心倾销有一些实验。