JVM学习-2 编译并调试openjdk的zero版

阅读更多

上次我成功用netbeans编译并调试openjdk7以后,发现call stack里有一部分居然是汇编,后来了解到openjdk为了优化性能,把核心解释器全部用汇编写的,叫做template interpreter。结构如下图左侧:

汇编这个东西我是看不懂了,所以我必须编译一个C++解释器版本(右侧图),确切的说,jdk编译的时候,在make命令后面加上CC_INTERP=1这个参数。的确是有人写过帖子说在x86 32位机器上经过小小的修改源码就能编译成功c++ interpreter版本。然而我不行。我下载了整个openjdk7的代码库,尝试切换到不同的tag,均告失败,基本上人家openjdk团队就没打算维护c++ interpreter这个东西,我看到一堆编译错误。

 

后来我发现有一个叫icedtea的东西,可以用来编译zero版本的openjdk.zero的意思就是zero-assembly,即零汇编,没有汇编。上图中c++ interpreter下的support layer也用c++写成。icedtea原本的目的是帮助提供编译一个完全开源的openjdk。同时它还能简化openjdk的编译过程,即采用先configure,再make的方式。这里我只关心icedtea能帮助我实现编译一个zero版本在我的x86 i32上。我下载了binary的icedtea版本,结果无法编译成功。后来我专心看了zero作者的个人主页上的每一篇博客,发现一篇很有用:http://gbenson.net/?p=100

我按照这篇文章,忽略llvm的部分,采用编译icedtea源码的方式,成功编译了openjdk6的zero版本。icedtea很方便,甚至自己会去下载openjdk的源码,然后打patch,然后编译。

具体的命令如下:

./configure --enable-zero
make icedtea-against-ecj
make hotspot

 

然后,我又想着如何在netbeans里调试这个zero版本的jdk.一开始还想着这个默认编译出来的不是debug版本,后来发现g++后面都跟了-g参数,所以明白即使在product目录下,编译出来的hotspot依然是带debug信息的。在netbeans下要实现代码辅助(code assistance),必须在netbeans里build一次,但是这时nb报错了。原因是LD_LIBRARY_PATH被make reset了,于是我调整了$(root_Icedtea_dir)\Makefile里的LD_LIBRARY_PATH参数.

后来我开始调试,发现很多变量看不到值,原来是被优化了。于是我只好再去修改openjdk-ecj/hotspot/make/linux/makefiles/gcc.make文件,使g++的O3改为O0,彻底不优化。

 

到此为止,在netbeans下调试hotspot的任务算是完成了。但是想到还有一个问题没解决,就是jdk目录下的c++源码还不能代码智能提示。

 

本次重要参考文献:http://gbenson.net

你可能感兴趣的:(JVM学习-2 编译并调试openjdk的zero版)