手机版
你好,游客 登录 注册
背景:
阅读新闻

Java虚拟机HotSpot调试实例

[日期:2017-12-03] 来源:Linux社区  作者:abaoge [字体: ]

这篇文章,怎么说呢。是踩了很多坑得出来了,也是在自己快要崩溃的时候得出来了的。连续踩了差不多10来个小时的坑,还好是出来了。

这篇文章是调试虚拟机的,其实网上也能找到一些文章,但是每个人的环境不一样,可能有的很顺利,有的就不一样了。但是踩了坑比较多,你才会横向发现有些别人其实是没讲到位的,也就是一笔带过的。

上一篇文章我写了关于编译openjdk的文章,这篇实际上是接着上一篇来的(见 http://www.linuxidc.com/Linux/2017-12/149076.htm)。

openjdk编译后会成为一个可用的jdk,jdk中就包含了虚拟机。虚拟机,众所周知,是一个让class文件运行的平台,那么这次调试,你可以先理解为当class文件运行,我们将断点停留在虚拟机。

有了这个初步的感性认识你可能好理解得多了。

来,我们一步步顺着好理解的逻辑来解决这个问题。

1、既然是要调试虚拟机,那我们最好是不是要一个ide来调试呢,由于虚拟机是c编写的,所以我们下载一个netBeans Ide。

  这里要提示两点,第一点,下载ide的时候要下载c++版本的。第二点ide最好下载7.0.1版本的,因为有些版本无法跳入到断点,这算一个坑

  你弄了半天都不知道为什么。当然如果你是大神,你可以直接使用gdb来调试。

2、在netBeans中新建基于源码c/c++项目。

3、找到你openjdk下关于hotspot的源码文件夹,并填好,以及选择定制

4、写上hotspotmake目录下makefile的路径

5、下一步要填写一些生成命令,我的是如下:

${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=/usr/Java/jdk1.6.0_32 ARCH_DATA_MODEL=64 LANG=C  

中间的alt_bootdir实际上我上篇文章编译openjdk的那个Oracle jdk1.6。至于为什么要用这个版本大家可以去查一下,

其实还有另一点。你电脑上如果jdk是1.8的,你的netBeanIde运行不起来,所以低版本就好,我的是1.6.0_32。

6、一直点下一步,在ide中会出现hotspot项目。

7、右键点击项目,选择属性,再点运行,又出来三个需要配置的地方。

 

 运行命令的意思是,用什么去运行什么,第一个什么就是gamma,这个gamma就是虚拟机程序,第二个什么就是指的你要在虚拟机上运行的class文件。当然class文件的运行

实际上是为了调试虚拟机,这点要清楚,你class都没有运行,怎么调试你的虚拟机呢。我的命令如下:

/usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/gamma -XX:StopInterpreterAt=1 -version /usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/Queens

注意中间的空格,gamma是hotspot源代码编译后生成的,要生成后才有,但是你要找到你gamma的路径,后面的两个是gamma的参数,最后的一个长路径是你要

运行的class文件地址。你大可写成绝对路径,就不用在后续的classpath地址上加这个长路径了。

 

运行目录我填的是/usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg。

 

环境变量如下:

 

 JAVA_HOME  :/usr/java/jdk1.6.0_32

CLASSPATH:.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar

LD_LIBRARY_PATH: /usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg

我的是这样的,你们可能需要对照的改一下。

 最后保存上面的更改。

8、在下图的文件层次结构下找到java.c这个就是虚拟机的入口了,你可以先打上断点。然后右击项目选择调试

9、点了调试后会是漫长的等待,知道有一刻你发现断点在main函数中停留了,那就说明是成功了,最后运行完毕后,可以看到控制台的结果如下:

那就说明能调试成功了。

10、现在你就可以将你的程序替换上面的Queens类文件了,当你的程序运行的时候你就可以进一步窥探虚拟机怎么运行的了。

谢谢各位,如果看完了,希望能关注一波,写这个东西很费时间的,文章不是重点,交个朋友才是重中之重!

在Eclipse中进行HotSpot的源码调试  http://www.linuxidc.com/Linux/2015-05/117250.htm

Ubuntu 14.04下Java虚拟机(HOTSPOT)源代码编译步骤  http://www.linuxidc.com/Linux/2016-04/130484.htm

CentOS上编译OpenJDK8源码及在Eclipse上调试HotSpot虚拟机源码   http://www.linuxidc.com/Linux/2017-06/144713.htm

更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-12/149077.htm

linux
相关资讯       HOTSPOT  HotSpot调试 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款