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类文件了,当你的程序运行的时候你就可以进一步窥探虚拟机怎么运行的了。
谢谢各位,如果看完了,希望能关注一波,写这个东西很费时间的,文章不是重点,交个朋友才是重中之重!
hotspot虚拟机的调试的更多相关文章
- JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型
目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内 ...
- HotSpot虚拟机对象相关内容
一.对象的创建 1.类加载检查 普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化 ...
- HotSpot虚拟机对象探秘-笔记
学习目的:探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1.对象的创建 虚拟机在执行到一条new指令时,先要检查指令的参数(将要实例化的类)是否已经被加载.解析.初始化过,如果 ...
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
- HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)
以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位 一.对象的创建 1)类加载:虚拟机遇到一条new指令时,先检测这个指令的参数能否在常量池中定位到 ...
- JDK1.7 Update14 HotSpot虚拟机GC收集器
在测试服务器上使用如下命令可以查看当前使用的 GC收集器,当然不止这一个命令可以看到,还有其他一些方式 第三列”=”表示第四列是参数的默认值,而”:=” 表明了参数被用户或者JVM赋值了 [csii@ ...
- HotSpot虚拟机
注:如其中有不懂的名词,下面有名词解释 1.对象的创建(限于普通Java对象,不包括数组和Class对象等) (1)检查这个指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是 ...
- HotSpot 虚拟机对象揭秘【转载】
对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解 ...
- 晚期(运行期)优化---HotSpot虚拟机内的即时编译器
最初java程序是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”.为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相 ...
随机推荐
- zookeeper 笔记-机制的特点
zookeeper的getData(),getChildren()和exists()方法都可以注册watcher监听.而监听有以下几个特性: 一次性触发(one-time trigger) 当数据改变 ...
- 总结HTML5
都说项目页面是HTML5写的,但是HTML5的特别之处用了多少? 1.是不是页面布局都是统一的div,然后class写样式?可是HTML5提供了好多新标签 ,css中直接用标签名即可定义样式,不用费力 ...
- [POJ 1410] Intersection(线段与矩形交)
题目链接:http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS Memory Limit: 10000K Total Sub ...
- Linux系统EXT文件系统
分区格式化(Linux创建文件系统):(假设需要格式化的分区为/dev/sdb1) 1. ext2文件系统和ext3文件系统的区别: ext2不支持日志文件系统,不会产生日志文件,ext3则会产生日志 ...
- phalcon——闪存消息
使用两种适配器来定义消息传递给Flasher后的行为: (1)Phalcon\Flash\Direct:直接输出传递给flasher的消息 (2)Phalcon\Flash\Session:将消息临时 ...
- eclipse查看类源码出现failed to create the part's controls的解决方法
刚装好eclipse和Tomcat ,在看准备使用的一个开源框架jeesite,可是在查看源代码的时候出现这个问题
- 26.Linux-网卡驱动(详解)
1.描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议. 网卡设备与字符设备和块 ...
- Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能
1 环境搭建 1.1 Python安装 1.2 MySQL环境搭建 1.3安装MySQLdb 2 具体实现 2.1 登陆界面 2.2 注册界面 2.3 具体实现部分代码 1 环境搭建 1.1 P ...
- 菱形开合的实现 IOS
实现的原理: 利用了自动布局和形变 核心代码块: @implementation JHMainView { UILabel *label1,*label2,*label3,*label4; UIBut ...
- javascript中的变量、作用域和内存问题
1.变量 变量的值的类型:基本类型值和引用类型值两种. 基本类型:Undefined.Null.Boolean.String.Number,这五类基本数据类型的值在内存中占有固定大小的空间,因此保存在 ...