JVM学习(一)使用netbeans调试Hotspot虚拟机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18870127/article/details/87690382

折腾了一天,把调试Hotspot踩过的坑分享出来,注意使用root权限,切记!!!

首先说下环境:

Centos 7 ,jdk1.7u80.获取为官网,可参考此博客的获取方式:

https://blog.csdn.net/weixin_39917216/article/details/81296006

openjdk 源码获取网址:http://hg.openjdk.java.net/jdk7u/jdk7u-dev/

 1.将原有的Centos 7 自带的openjdk卸载

首先可以通过如下命令查找系统中已有的java jdk:

rpm -qa|grep java

通过命令将原有的jdk卸载:

rpm -e --nodeps ......

详细可参考此必博客:https://blog.csdn.net/jzp630641095/article/details/72743000

注意,在卸载jdk的时候不要卸载.noarch的文件;

在安装时候可以参考此博客

https://blog.csdn.net/yyongsheng/article/details/83033022

当然可以根据自己的需要创建在不同位置的文件夹,全凭个人需要,然后解压缩在此文件夹

注意的是,上述博客的环境变量的配置就不要在这里配置了,因为如果在这里进行了如上的环境配置是配置的Linux

系统的环境配置,当我们编译openjdk源码时会出现错误,所以先不进行环境变量的操作。

2.openjdk源码下载进行编译

首先配置编译所需要的环境:

yum install -y mercurial
yum install -y ant ant-nodeps
yum install -y libX11* libX*
yum install -y libXi-devel libXtst-devel libXt-devel freetype* 
yum install -y alsa-lib-devel cups-devel
yum install -y gcc gcc-c++
yum install -y glibc-static libstdc++-static

然后准备开始编译,在源码的主文件夹下面可以创建一个shell文件,其可以控制要编译的内容和编译的方式,内容如下:

#设置环境语言,不设置会报一个hashtable NPE错误
export LANG=C
#Bootstrap JDK的安装路径,必须设置
export ALT_BOOTDIR=****刚才安装的jdk的路径****
#允许自动下载依赖
export ALLOW_DOWNLOADS=true

#并行编译的线数,设置和cpu的数量一致即可
export HOTSPOT_BUILD_JOBS=1
export ALT_PATALLER_COMPILE_JOBS=1

#比较本次build出来的映像与先前版本的差异,这对我们来说没有意义,
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true

#指定要编译的内容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_CORBA=true

#要编译的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug

#可以避开javaws和浏览器Java插件之类的部分build
BUILD_DEPLOY=false

#设置成false就不会build出包装包,因为包装包里有些奇怪的依赖
#但是即使不build出它也已经能得到完整的JDK映像,所以还是别build它好了
BUILD_INSTALL=false

#编译结果存放的路径
export ALT_OUTPUTDIR=****自己设定编译好的结果的存放路径*****

#卸载环境变量,避免诡异的事情发生,避免出错
unset JAVA_HOME
unset CLASSPATH
unset JAVA_OPTS

make 2>&1 | tee $ALT_OUTPUTDIR/build.log

然后执行命令:make sanity,我就在这里遇到错误了,错误为没有相应的文件夹:

jdk/make/common/shared/Defs-control.gmk,没有此文件或目录,

这种情况是源码没有下在全面,如果有的话,make sanity 只要自己写的shell没错的话应该就会通过,可以参看此博客:

http://www.zuidaima.com/blog/3862384921103360.htm

其他问题可参考此博客:

https://blog.csdn.net/zitong_ccnu/article/details/50149757

之后就是编译了,执行自己编写的shell脚本:

./***.sh,就开始编译了,编译完成后的结果如上面博客中那样,但是,在这一步我之前用的jdk为1.7u75,结果错为ant的版本太低,至少需要jdk1.7.1以上的版本,无奈我又重新找了本次使用且配置成功的jdk1.7u80

然后编译时间相当的````````长。

然后进入build/j2sdk-image目录下,查看整个JDK的编译结果,运行java –version ,可以看到自己的jdk的版本信息

接下来就可以运行hotspot了。

运行之前需要先去编辑env.sh文件:

 虚拟机的输出结果存放在build/hotspot/outputdir/linux_i486_compiler2路径下,目录下面有一个product文件夹,此文件夹中有提到的env.sh文件。

使用VIM编辑product目录下的env.sh

我们发现里面已经有了JAVA_HOME CLASSPATH HOTSPOT_BUILD_USER等环境变量,我们还需要添加一个LD_LIBRARY_PATH,否则在运行时还会出现问题。

LD_LIBRARY_PATH=.:${JAVA_HOME}/jre/lib/amd64/native_threads:${JAVA_HOME}/jre/lib/amd64:

export LD_LIBRARY_PATH

之后进行测试:

. ./env.sh

./gamma –vesion

3.netbeans 安装

可从官网上下载netbeans安装包,在这里我使用的为netbeans 7.4,担心版本太高jdk支持不了。

我下的是rpm的,文件为******.sh 所以在执行之前需要先去改动权限。chmod 755 *******.sh

然后执行,安装命令:./*****.sh --javahome /java jdk 路径/**/

这样会在桌面上有一个图标,类似于windows,可以双击进入。

安装好之后需要将openjdk源码进行导入:

下一步会进行配置:

将hotspot的源码的文件夹路径选择好,并选择定制按钮。下一步:

下一步需要将Hotspot文件夹下的makefile文件对应选上。在进行下一步:

注意这里需要改下生成命令:

${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=/***jdk路径****/ ARCH_DATA_MODEL=64 LANG=C   

然后下一步:

会然配置项目属性:

运行命令的意思是,用什么去运行什么,第一个什么就是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地址上加这个长路径了。

环境变量设置:

 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(等同于运行目录)

路径根据自己的设置进行调整。

然后根据下图就找到了main主函数入口了。

右键项目,然后选择调试,当看到此输出内容时,说明成功了。

期间可能会遇到无法在某个文件夹下面创建内容的问题,这是由于权限造成的,可以将openjdk所在的文件夹修改权限,全部修改为你当前使用的用户所有:

chown -R 用户名 文件夹名字,其次如还不行,则需要提升用户权限了。

代码不易,且行且珍惜。

猜你喜欢

转载自blog.csdn.net/qq_18870127/article/details/87690382