关键词

OpenJDK源码调试图文教程

首先需要明确的是,OpenJDK的源码调试需要借助GDB来实现,具体步骤如下:

步骤一:下载OpenJDK源码

可以到OpenJDK的官网(https://jdk.java.net/16/)下载源码压缩包,选择源码版本为当前使用的JDK版本对应的源码版本。下载后解压缩。

步骤二:为OpenJDK编译符号表

使用如下命令编译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 openjdk
(gdb) target remote :9091
(gdb) symbol-file $OPENJDK/build/linux-x86_64-server-slowdebug/hotspot/outputdir/libjvm.so

其中9091是本机的端口号,可以用java命令启动程序时设置,用来和GDB进行远程调试连接。

步骤四:使用GDB进行调试

在GDB中使用set breakpoint和continue命令对程序进行调试,例如,对于HelloWorld程序,可以在main函数处设断点,然后让程序继续运行。

(gdb) break main
(gdb) continue

程序在断点处停下后,可以使用如下命令查看程序的堆栈:

(gdb) bt

另外可以使用print命令输出变量的值,例如:

(gdb) print i
$1 = 123

以上就是使用GDB调试OpenJDK源码的完整步骤。

两条示例说明:

示例一:调试HashMap的实现过程

我们可以使用如下命令打开HashMap.java文件:

vim src/java.base/share/classes/java/util/HashMap.java 

然后可以在源码中加入一些打印信息,来定位到问题所在,例如,在put方法中添加打印语句:

System.out.println("adding key=" + key + ", value=" + value);

然后按照以上步骤进行调试,就可以看到具体异常产生的过程。

示例二:调试JVM的内存泄漏问题

我们可以使用如下命令开启JVM的内存泄漏检测工具:

jmap -histo:live <pid> | head -n 30

然后按照以上步骤进行调试,在GDB中查看堆栈信息,通过定位到具体的GC导致OOM等问题。

总之,OpenJDK源码调试需要结合具体问题和场景进行调整,但以上步骤和示例可供参考。

本文链接:http://task.lmcjl.com/news/13179.html

展开阅读全文