`
hatedance
  • 浏览: 57957 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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, openjdk8源码, openjdk7, make3.81源码

    编译调试jvm, openjdk8源码, openjdk7, make3.81源码

    Open-JDK-13:编译出的OpenJDK-13 JVM内核分析

    1系统环境 Xcode Oracle JDK:13 先确保系统已安装freetype和ccache 自由类型:2.9 ccache:3.3.5 $ brew install freetype ccache ...-- with - jvm - variants = server 编译server类型JVM -- wi

    openjdk-7u40源代码1

    openjdk-7u40的源代码。要深入JVM底层必须手动编译过JVM,并调试执行关键代码块。

    openjdk12源码.zip

    https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f 注意!看了周志明的《深入理解Java虚拟机》上面帖的地址。上面的网站下载得文件不知道是服务器的原因还是什么...编译openjdk12源码,调试jvm。可以下载这个

    Bytecoder:用于JVM字节码的丰富域模型和用于解释和转换它的框架

    OpenCL和其他语言主要的编译目标是JavaScript和WebAssembly 充当LLVM的JVM字节码前端支持Java 8、9、10、11、12、13和14 与调试器工具链和SourceMaps配合良好允许与其他UI框架集成,例如vue.js 由OpenJDK 14作为JRE ...

    HotSpot实战高清版本

    本书深入浅出地讲解了 HotSpot 虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包 括 OpenJDK 与 HotSpot 项目、编译和调试 HotSpot 的方法、HotSpot 内核结构、Launcher、OOP-Klass 对象表 示系统...

    jdk12-06222165c35f.zip

    这个是从openjdk官网下载的源码,openjdk12,有感兴趣的同学,想编译openjdk12源码,调试jvm的,从官网下载慢的,可以下载这个

    HotSpot实战

    包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器...

    .java源码安装-application-java-source-installation-rhel8:Java是基于类的,面向对象的编程语

    Kit的缩写,包括编译,调试和执行Java程序所需的所有工具,可执行文件和二进制文件.JDK依赖于平台,即Windows,Mac和Unix系统有单独的安装程序.JDK包括JVM和JRE完全负责代码执行。 OpenJDK安装- 打开JDK站点地址: ...

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近...附录A 编译Windows版的OpenJDK 附录B 虚拟机字节码指令表 附录C HotSpot虚拟机主要参数表 附录D 对象查询语言(OQL)简介 附录E JDK历史版本轨迹

Global site tag (gtag.js) - Google Analytics