折腾了一天,把调试Hotspot踩过的坑分享出来,注意使用root权限,切记!!!
首先说下环境:
Centos 7 ,jdk1.7u80.获取为官网,可参考此博客的获取方式:
https://blog.csdn.net/weixin_39917216/article/details/81296006
openjdk 源码获取网址:http://hg.openjdk.java.net/jdk7u/jdk7u-dev/
首先可以通过如下命令查找系统中已有的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源码时会出现错误,所以先不进行环境变量的操作。
首先配置编译所需要的环境:
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
可从官网上下载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 用户名 文件夹名字,其次如还不行,则需要提升用户权限了。
代码不易,且行且珍惜。