共计 3881 个字符,预计需要花费 10 分钟才能阅读完成。
在阅读 OpenJDK 源码的过程中,经常需要运行、调试程序来帮助理解。我们现在已经可以编译出一个调试版本 HotSpot 虚拟机,禁用优化,并带有符号信息,这样就可以使用 GDB 来进行调试了。许多对虚拟机了解比较深的开发人员确实就是直接使用 GDB 加 VIM 编辑器来开发、修改 HotSpot 的,不过相信大部分读者更倾向于在 IDE 环境而不是纯文本的 GDB 下阅读、跟踪 HotSpot 源码,在上篇文章中已经介绍过如何在 CentOS 6.5 上编译 OpenJDK7 源码,现继续介绍如何在 Linux 下搭建基于 eclipse 的 Hotspot 源码调试环境。
软件环境
OS:CentOS 6.5
JDK Version:openjdk-7u6-fcs-src-b24-28_aug_2012
IDE:eclipse-cpp-kepler-SR2-linux-gtk-x86_64
下载 eclipse,地址:http://www.eclipse.org/cdt/downloads.php,注意 eclipse 支持 C/C++ 的版本。
我下载的是 eclipse-cpp-kepler-SR2-linux-gtk-x86_64.tar.gz
具体操作
Step 1:首先解压 JDK 源码包,启动 eclipse,依次选择File
> New
> Makefile Project with Existing Code
接着出现下面的界面:
Step 2:定位到项目名 右键
> Properties
>C/C++ Build
需要修改两个地方:
将 Builder 里口 Use default build command 的对勾去掉,填入参数
ARCH_DATA_MODEL=64
将 Build location 的 Build directory 追加上 /make,最终是 ${workspace_loc:/hotspot}/make,目的是告诉 make 编译器到该目录下寻找编译文件 Makefile。
Step 3:选择菜单栏Project
> Build Project
,看到已经开始 build 了,午休一下吧(首次 build 大概需要 10-20m)。
部分 LOG 信息:
……
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: /usr/bin/objcopy cmd found so will create .debuginfo files.
INFO: STRIP_POLICY=min_strip
INFO: ZIP_DEBUGINFO_FILES=1
make[1]: Entering directory `/home/jvm/opt/openjdk/hotspot/make’
make[1]: Nothing to be done for `generic_export’.
make[1]: Leaving directory `/home/jvm/opt/openjdk/hotspot/make’
02:01:39 Build Finished (took 23s.540ms)
Step 4:编译成功之后就可以测试了,需配置如下几步:
点选菜单栏 Run > Debug Configurations > New launch configuration,在 C /C++ Application 里填入 /home/jvm/opt/openjdk/hotspot/build/linux/linux_amd64_compiler2/fastdebug/gamma
Project 选择当前项目。
在 Argument tab 页里 Program arguments 填入 -version
在 Environment tab 页里 Environment variables to set 填入 JAVA_HOME | /application/java/jdk
在 Common tab 页里勾选 Debug
配置完毕后,点击 Debug 即可进入调试模式
由于 HotSpot 的源码比较长,C/C++ 文件数量也很多,为了便于阅读,代码清单给出了各个目录中代码的主要用途,供参考。
代码清单 HotSpot 源码结构
hotspot
├─agent Serviceability Agent 的实现
├─make 用来 build 出 HotSpot 的各种配置文件
├─src HotSpot VM 的源代码
│ ├─cpu CPU 相关代码
│ ├─os 操作系相关代码
│ ├─os_cpu 操作系统 +CPU 组合的相关代码
│ └─share 平台无关的共通代码
│ ├─tools 工具
│ │ ├─hsdis 反汇编插件
│ │ ├─IdealGraphVisualizer 将 Server 编译器的中间代码可视化的工具
│ │ ├─launcher 启动程序 ”java”
│ │ ├─LogCompilation 将 -XX:+LogCompilation 输出的日志(hotspot.log)整理成更容易阅读的格式的工具
│ │ └─ProjectCreator 生成 Visual Studio 的 project 文件的工具
│ └─vm HotSpot VM 的核心代码
│ ├─adlc 平台描述文件(上面的 cpu 或 os_cpu 里的 *.ad 文件)的编译器
│ ├─asm 汇编器接口
│ ├─c1 Client 编译器
│ ├─ci 动态编译器的公共服务 / 接口
│ ├─classfile 类文件的处理(包括类加载和系统符号表等)
│ ├─code 动态生成的代码的管理
│ ├─compiler 编译器接口
│ ├─gc_implementation GC 的实现
│ │ ├─concurrentMarkSweep Concurrent Mark Sweep GC 的实现
│ │ ├─g1 Garbage-First GC 的实现(不使用老的分代式 GC 框架)
│ │ ├─parallelScavenge ParallelScavenge GC 的实现(Server VM 默认,不使用老的分代式 GC 框架)
│ │ ├─parNew ParNew GC 的实现
│ │ └─shared GC 的共通实现
│ ├─gc_interface GC 的接口
│ ├─interpreter 解释器,包括 ” 模板解释器 ”(官方版在用)和 “C++ 解释器 ”(官方版不再用)
│ ├─libadt 一些抽象数据结构
│ ├─memory 内存管理相关(老的分代式 GC 框架也在这里)
│ ├─oops HotSpot VM 的对象系统的实现
│ ├─opto Server 编译器
│ ├─prims HotSpot VM 的对外接口,包括部分标准库的 native 部分和 JVMTI 实现
│ ├─runtime 运行时支持库(包括线程管理、编译器调度、锁、反射等)
│ ├─services 主要是用来支持 JMX 之类的管理功能的接口
│ ├─shark 基于 LLVM 的 JIT 编译器(官方版里没有使用)
│ └─utilities 一些基本的工具类
└─test 单元测试
参考资料
《深入 Java 虚拟机》
深入 Java 虚拟机(原书第 2 版) PDF【中文版 + 附光盘源码】下载地址:http://www.linuxidc.com/Linux/2013-06/86222.htm
Ubuntu 14.04 LTS 安装 Java 8 和 Eclipse 4.4 http://www.linuxidc.com/Linux/2014-11/109217.htm
Hadoop Eclipse 插件编译安装 1.2.0 http://www.linuxidc.com/Linux/2013-07/87428.htm
Hadoop 在 Eclipse 中的插件编译 http://www.linuxidc.com/Linux/2013-04/83295.htm
Hadoop 1.2.1 编译 Eclipse 插件 http://www.linuxidc.com/Linux/2013-10/91666.htm
Ubuntu 13.10 安装 JDK、Eclipse for C/C++(解决全局菜单问题)http://www.linuxidc.com/Linux/2013-11/92305.htm
如何���Ubuntu 14.04 中安装最新版 Eclipse http://www.linuxidc.com/Linux/2014-08/105090.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-05/117250.htm