转载

在 NetBeans 中编译调试 OpenJdk

为了方便所有人都可以编译调试 OpenJdk,按照 OpenJdk 8 的推荐的配置,在虚拟机中配置好了环境。现在将该虚拟机分享出来方便有兴趣的人使用。

下载地址

链接: https://pan.baidu.com/s/1Lo7JiZfD9ikwSlhXZEsM8A

密码:yflp

大小:1.67G

解压要求磁盘有 20G 可用空间。

点击【查看原文】后跳转到可以点击的连接。

虚拟机要求

虚拟机版本:VMware 10.0.1 build-1379776。

低版本需要自己改版本号,高版本能直接用。

编译 OpenJdk 的时候配置越高耗时越少,所以第一次编译的时候尽可能配置更高的内存和CPU。默认配置的单处理器2核心和4G内存,电脑配置不高的可以减半。

使用方法

下载后解压,然后用 VMware 打开,运行时选择【我已移动】。

系统的用户名和密码分别为 openjdk123 。 登陆时输入密码 123 即可。

进入系统后,界面如下:

在 NetBeans 中编译调试 OpenJdk

点击左侧【菜单】中第 6 个按钮(倒数第二个)NetBeans IDE。

在 NetBeans 中编译调试 OpenJdk 启动 IDE 后,展开 OpenJDK,找到 jdk8 下面的 configure,右键 Run 执行。这个操作会很快,输出的部分日志( 完整日志下载 )如下:

Running generated-configure.sh
configure: Configuration created at Wed May  9 22:02:11 CST 2018.
configure: configure script generated at timestamp 1389186094.
checking for basename... /usr/bin/basename
checking for bash... /bin/bash
checking for cat... /bin/cat
...
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
...
====================================================
A new configuration has been successfully created in
/home/openjdk/OpenJdk/jdk8/build/linux-x86_64-normal-server-release
using default settings.

Configuration summary:
* Debug level:    release
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64

Tools summary:
* Boot JDK:       java version "1.7.0_121" 
(7u121-2.6.8-1ubuntu0.12.04.3) OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)  
(at /usr/lib/jvm/java-7-openjdk-amd64)
* C Compiler:     gcc-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/gcc-4.6)
* C++ Compiler:   g++-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/g++-4.6)

Build performance summary:
* Cores to use:   2
* Memory limit:   3945 MB
* ccache status:  not installed (consider installing)

WARNING: The result of this configuration has overridden an older
configuration. You *should* run 'make clean' to make sure you get a
proper build. Failure to do so might result in strange build problems.


RUN SUCCESSFUL (total time: 7s)

然后在 OpenJDK 项目上右键【Build】,这个过程在我电脑上使用了 27 分钟,这个期间可以干点别的。输出的部分日志( 完整日志下载 )如下:

Cleaning langtools build artifacts ... done
...
Cleaned all build artifacts.

CLEAN SUCCESSFUL (total time: 158ms)

## Starting langtools
...
## Finished langtools (build time 00:00:59)

## Starting hotspot
make[2]: warning: -jN forced in submake: disabling jobserver mode.
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: ALT_OBJCOPY=/usr/bin/objcopy
...
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/adlparse.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/archDesc.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/arena.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/dfa.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/dict2.cpp


----- Build times -------
Start 2018-05-09 22:12:27
End   2018-05-09 22:39:06
00:01:10 corba
00:00:33 demos
00:12:55 hotspot
00:01:17 images
00:00:36 jaxp
00:01:16 jaxws
00:07:32 jdk
00:00:59 langtools
00:00:19 nashorn
00:26:39 TOTAL
-------------------------
Finished building OpenJDK for target 'images'

BUILD SUCCESSFUL (total time: 26m 40s)

编译完成后,先找到 java.c 文件:

在 NetBeans 中编译调试 OpenJdk

搜索文件:

在 NetBeans 中编译调试 OpenJdk

打开该文件,然后找到 JavaMain 方法,添加断点:

在 NetBeans 中编译调试 OpenJdk

在 NetBeans 的工程中,还有一个 JavaProject1 项目,里面有一个简单的 Java 代码,如下图所示:

在 NetBeans 中编译调试 OpenJdk

下面我们调试 javac -cp xxx/classes test.Main 方法,在项目中,更具体的配置如下:

"${OUTPUT_PATH}" -cp /home/openjdk/NetBeansProjects/JavaApplication1/build/classes test.Main 1 2 3 hello 5

配置方式如下:

在 NetBeans 中编译调试 OpenJdk

在调试时还可能会有一个找不到 java 的错误,这个错误和下面的配置有关:

在 NetBeans 中编译调试 OpenJdk

路径:../../build/linux-x86_64-normal-server-release/jdk/bin/java

选择 java.c 文件,点击如图 Debug:

在 NetBeans 中编译调试 OpenJdk

进入断点后如下图所示:

在 NetBeans 中编译调试 OpenJdk

在 Debug 时,无法断点进入 Java 代码内。当 Java 代码调用 native 方法时,这些方法都可以断点,也就是从 java.c 调试能看到所有 c 和 cpp 代码的执行过程,看不到 Java 的。

注意:linux 系统相关的 native 代码一般都在 jdk8/jdk/src/solaris 目录中。

例如上述调试过程中,Java 代码中有 System.out.println 调用,我们可以在 solaris/native/java/io/FileOutputStream_md.c 中的 Java_java_io_FileOutputStream_writeBytes 方法断点,当执行到 println 时就会进入这里的断点,如下所示:

在 NetBeans 中编译调试 OpenJdk

好了

到这里最基本的用法都说完了,如果想要测试 GC 等功能,可以通过合适的 Java 代码和 JVM 参数来启动 Debug,如果大家发现更好玩的用法欢迎留言交流。

最后奉劝一句,如果没有足够多的空闲时间,还是不要深入去看 OpenJdk 中的 c 和 cpp 代码,如果有这个时间不如先看看 JVM 规范和 Java 规范,看看 OpenJdk 中 Java 代码的实现部分。

Java 文档: https://docs.oracle.com/javase/10/

Java 规范: https://docs.oracle.com/javase/specs/index.html >

不管你是否听劝,我是不打算深入到这种程度来研究了。

写作本文的主要目的就是想为你在 OpenJdk 方面的研究节省更多的时间。

如果你对 JVM 底层很感兴趣,还可以看看万能的 GraalVM

原文  https://blog.csdn.net/isea533/article/details/80234007
正文到此结束
Loading...