阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

在Eclipse中进行HotSpot的源码调试

128次阅读
没有评论

共计 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

在 Eclipse 中进行 HotSpot 的源码调试

接着出现下面的界面:

在 Eclipse 中进行 HotSpot 的源码调试

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)。

在 Eclipse 中进行 HotSpot 的源码调试

部分 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

在 Eclipse 中进行 HotSpot 的源码调试

 配置完毕后,点击 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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计3881字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中