0

J9 VM在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
4

1 回答 1

3

这是设计使然(下面以粗体显示):

Linux 不提供用于从正在运行的进程生成系统转储的操作系统 API。JVM 通过使用 fork() API 启动与父 JVM 进程相同的进程,在 Linux 上生成系统转储。然后 JVM 在子进程中生成一个 SIGSEGV 信号。SIGSEGV 信号使 Linux 为子进程创建系统转储。父 JVM 根据需要通过 -Xdump 选项处理和重命名系统转储,并且可能会将其他数据添加到转储文件中。

子进程的系统转储包含父进程中使用的内存区域的精确副本。SDK 转储查看器可以从系统转储中获取有关 Java 线程、类和堆的信息。但是,转储查看器 [gdb] 和其他系统转储调试器仅显示在子进程中运行的单个本机线程

如果你想要所有线程,你可以巧妙地使用gcore ${PID}-Xdump:tool并执行gcore %pid

IBM提出了一个内核 API 来创建核心转储,但由于安全原因 (DoS) 被拒绝。有一些关于用户级核心转储的实验。

于 2016-05-06T22:13:06.013 回答