hotspot虚拟机的调试
3这篇文章,怎么说呢。是踩了很多坑得出来了,也是在自己快要崩溃的时候得出来了的。
连续踩了差不多10来个小时的坑,还好是出来了。
这篇文章是调试虚拟机的,其实网上也能找到一些文章,但是每个人的环境不一样,可能有的很顺利,有的就不一样了
但是踩了坑比较多,你才会横向发现有些别人其实是没讲到位的,也就是一笔带过的。
上一篇文章我写了关于编译openjdk的文章,这篇实际上是接着上一篇来的。
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类文件了,当你的程序运行的时候你就可以进一步窥探虚拟机怎么运行的了。
谢谢各位,如果看完了,希望能关注一波,写这个东西很费时间的,文章不是重点,交个朋友才是重中之重!
转载于:https://www.cnblogs.com/abaoge/p/7958191.html
hotspot虚拟机的调试相关推荐
- JVM基础 之Java HotSpot虚拟机中的内存管理
1 简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...
- HotSpot虚拟机在java堆中的内存使用
1 简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...
- Java 14 Hotspot 虚拟机垃圾回收调优指南!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 大鹏123 来源 | www.cnblogs. ...
- JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
文章目录 思维导图 对象的创建 对象的内存布局 实例数据(Instance Data) 对齐填充(Padding) 对象的访问定位 使用句柄(类似间接指针) 直接指针访问 (HotSpot采用这种方式 ...
- JVM hotspot虚拟机对象探秘
为什么80%的码农都做不了架构师?>>> 本文全部内容均转述自<深入理解Java虚拟机 JVM高级特性与最佳实践(第二版)>2.3节 下载地址:http://pan ...
- HotSpot虚拟机在Java堆中对对象的管理
在大概了解了Java虚拟机中内存的大致分布后,接下来就应该了解虚拟机是如何在内存中管理对象的,毕竟Java是一门面向对象的语言,在Java程序的运行过程中会不断有对象创建出来.为了方便,这里仅仅以Ho ...
- Hotspot虚拟机的对象
创建 Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解析和初始化过.如果没有,那 ...
- Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
本文内容总结自周志明先生所编著的<深入理解Java虚拟机-JVM高级特性与最佳实践>此书的经典不必多说.本节内容是对象的内存布局. 在HotSpot虚拟机中,对象在内存中存储的布局可以分为 ...
- JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化
Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...
最新文章
- Elasticsearch相关配置
- 2021年互联网公司“死亡”名单!(附清单)
- PAT (Advanced Level) 1035. Password (20)
- Java中的JsonConfig详解
- UE4分支的Git Flow
- 使用idea 把项目上传到 svn
- 如何反编译微信小程序前端,30分钟教你学会
- php7 电子书 下载,php7.3.8中文电子手册
- Visual Studio 2012 下载地址 V11各种版本官方下载网址
- windows xp 美化大师
- 人工智能数学基础---定积分2:定积分的性质
- 2021年危险化学品生产单位安全生产管理人员考试题库及危险化学品生产单位安全生产管理人员最新解析
- 怎么把不能编辑的qlv转换成mp4
- 话费接口API优惠充值源码分享
- 【Python基础】字典dict和集合set
- Java发展前景与职业方向解析
- 快速上手golang
- 主题为吉他的html,HTML5 吉他标签生成器
- ARM中CPSR的标志位中的C和V
- shell编程之正则表达式与总结(grep,egrep)与文件处理器和总结(sed,awk,sort,uniq)
热门文章
- 操作系统——进程的定义、组成、组织方式、特征
- leetcode —— 235. 二叉搜索树的最近公共祖先
- PyTorch的Tensor(张量)
- 【例题+习题】【数值计算方法复习】【湘潭大学】(三)
- Towards Efficient Privacy-Preserving Inspection of TLS Encrypted Traffic
- Java出现No enclosing instance of type Test is accessible. Must qualify the allocation with an enclosin
- Knn原理及Python实现、数据展示
- 数值优化(Numerical Optimization)学习系列-目录
- 聚类方法:DBSCAN算法研究
- ImageMagick 拆分透明PNG 合并JPG和Alpha Mask