使用 Serviceability Agent 检查 JVM 核心转储时如何获取共享库列表?
How to get the Shared Library lists when check JVM core dump with Serviceability Agent?
使用可服务性代理为 JVM 调试传输的核心文件时,我们知道调试器可能会遇到问题
由于以下两类libraries:shared库和系统库不匹配,解决方案是将程序使用的所有库从核心主机复制到调试器主机。
我的问题是如何找到我们需要复制哪些库?
我们从一本书上看到有两种方法:
一种是 "The list of required library files can be obtained either from the hs_err log file under the section “Dynamic Libraries” another is " 通过使用本机调试器,例如 gdb、dbx 和 WinDbg。”
但是如果没有 hs_err 日志文件,但是要通过 dbg 获取所需的库吗? gdb有命令可以列出来吗?
使用 info sharedlibrary
或 info proc mapping
gdb 命令。
$ gdb -core core.3539 /usr/java/jdk1.8.0_102/bin/java
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007f5f11569a70 0x00007f5f11576ab1 Yes /lib/x86_64-linux-gnu/libpthread.so.0
0x00007f5f11350310 0x00007f5f1135d598 Yes (*) /usr/java/jdk1.8.0_102/bin/../lib/amd64/jli/libjli.so
0x00007f5f1114ada0 0x00007f5f1114b98e Yes /lib/x86_64-linux-gnu/libdl.so.2
0x00007f5f10da08b0 0x00007f5f10ef3334 Yes /lib/x86_64-linux-gnu/libc.so.6
0x00007f5f11781ac0 0x00007f5f1179f640 Yes /lib64/ld-linux-x86-64.so.2
0x00007f5f0ffaf840 0x00007f5f10885f58 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/server/libjvm.so
0x00007f5f0fa8d600 0x00007f5f0fafed0a Yes /lib/x86_64-linux-gnu/libm.so.6
0x00007f5f0f882100 0x00007f5f0f8851df Yes /lib/x86_64-linux-gnu/librt.so.1
0x00007f5f0f6752a0 0x00007f5f0f67c2a8 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libverify.so
0x00007f5f0f4525e0 0x00007f5f0f468a88 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libjava.so
0x00007f5f0f23d2d0 0x00007f5f0f242bf1 Yes /lib/x86_64-linux-gnu/libnss_compat.so.2
0x00007f5f0f026ff0 0x00007f5f0f0341e1 Yes /lib/x86_64-linux-gnu/libnsl.so.1
0x00007f5f0ee190b0 0x00007f5f0ee1f8ce Yes /lib/x86_64-linux-gnu/libnss_nis.so.2
0x00007f5f0ec071b0 0x00007f5f0ec0d2a1 Yes /lib/x86_64-linux-gnu/libnss_files.so.2
0x00007f5f0e9ec7f0 0x00007f5f0e9fd7a8 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libzip.so
0x00007f5ef2822a10 0x00007f5ef2830c68 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libnet.so
(*): Shared library is missing debugging information.
使用可服务性代理为 JVM 调试传输的核心文件时,我们知道调试器可能会遇到问题 由于以下两类libraries:shared库和系统库不匹配,解决方案是将程序使用的所有库从核心主机复制到调试器主机。
我的问题是如何找到我们需要复制哪些库? 我们从一本书上看到有两种方法: 一种是 "The list of required library files can be obtained either from the hs_err log file under the section “Dynamic Libraries” another is " 通过使用本机调试器,例如 gdb、dbx 和 WinDbg。” 但是如果没有 hs_err 日志文件,但是要通过 dbg 获取所需的库吗? gdb有命令可以列出来吗?
使用 info sharedlibrary
或 info proc mapping
gdb 命令。
$ gdb -core core.3539 /usr/java/jdk1.8.0_102/bin/java
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007f5f11569a70 0x00007f5f11576ab1 Yes /lib/x86_64-linux-gnu/libpthread.so.0
0x00007f5f11350310 0x00007f5f1135d598 Yes (*) /usr/java/jdk1.8.0_102/bin/../lib/amd64/jli/libjli.so
0x00007f5f1114ada0 0x00007f5f1114b98e Yes /lib/x86_64-linux-gnu/libdl.so.2
0x00007f5f10da08b0 0x00007f5f10ef3334 Yes /lib/x86_64-linux-gnu/libc.so.6
0x00007f5f11781ac0 0x00007f5f1179f640 Yes /lib64/ld-linux-x86-64.so.2
0x00007f5f0ffaf840 0x00007f5f10885f58 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/server/libjvm.so
0x00007f5f0fa8d600 0x00007f5f0fafed0a Yes /lib/x86_64-linux-gnu/libm.so.6
0x00007f5f0f882100 0x00007f5f0f8851df Yes /lib/x86_64-linux-gnu/librt.so.1
0x00007f5f0f6752a0 0x00007f5f0f67c2a8 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libverify.so
0x00007f5f0f4525e0 0x00007f5f0f468a88 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libjava.so
0x00007f5f0f23d2d0 0x00007f5f0f242bf1 Yes /lib/x86_64-linux-gnu/libnss_compat.so.2
0x00007f5f0f026ff0 0x00007f5f0f0341e1 Yes /lib/x86_64-linux-gnu/libnsl.so.1
0x00007f5f0ee190b0 0x00007f5f0ee1f8ce Yes /lib/x86_64-linux-gnu/libnss_nis.so.2
0x00007f5f0ec071b0 0x00007f5f0ec0d2a1 Yes /lib/x86_64-linux-gnu/libnss_files.so.2
0x00007f5f0e9ec7f0 0x00007f5f0e9fd7a8 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libzip.so
0x00007f5ef2822a10 0x00007f5ef2830c68 Yes (*) /usr/java/jdk1.8.0_102/jre/lib/amd64/libnet.so
(*): Shared library is missing debugging information.