首先需要明确的是,OpenJDK的源码调试需要借助GDB来实现,具体步骤如下:
可以到OpenJDK的官网(https://jdk.java.net/16/)下载源码压缩包,选择源码版本为当前使用的JDK版本对应的源码版本。下载后解压缩。
使用如下命令编译OpenJDK:
bash configure --disable-warnings-as-errors --with-debug-level=slowdebug
make LANG=C bash
编译完成后,以openjdk为例,可以在$OPENJDK/build/linux-x86_64-server-slowdebug/hotspot/outputdir/libjvm.so文件所在目录下找到符号表文件libjvm.gdb下文的命令将需要用到此文件。
运行GDB,并在其中加载需要调试的进程,以openjdk为例:
gdb openjdk
(gdb) target remote :9091
(gdb) symbol-file $OPENJDK/build/linux-x86_64-server-slowdebug/hotspot/outputdir/libjvm.so
其中9091是本机的端口号,可以用java命令启动程序时设置,用来和GDB进行远程调试连接。
在GDB中使用set breakpoint和continue命令对程序进行调试,例如,对于HelloWorld程序,可以在main函数处设断点,然后让程序继续运行。
(gdb) break main
(gdb) continue
程序在断点处停下后,可以使用如下命令查看程序的堆栈:
(gdb) bt
另外可以使用print命令输出变量的值,例如:
(gdb) print i
$1 = 123
以上就是使用GDB调试OpenJDK源码的完整步骤。
两条示例说明:
我们可以使用如下命令打开HashMap.java文件:
vim src/java.base/share/classes/java/util/HashMap.java
然后可以在源码中加入一些打印信息,来定位到问题所在,例如,在put方法中添加打印语句:
System.out.println("adding key=" + key + ", value=" + value);
然后按照以上步骤进行调试,就可以看到具体异常产生的过程。
我们可以使用如下命令开启JVM的内存泄漏检测工具:
jmap -histo:live <pid> | head -n 30
然后按照以上步骤进行调试,在GDB中查看堆栈信息,通过定位到具体的GC导致OOM等问题。
总之,OpenJDK源码调试需要结合具体问题和场景进行调整,但以上步骤和示例可供参考。
本文链接:http://task.lmcjl.com/news/13179.html