一、环境准备
1、Centos6.5:VMware上面安装Centos6.5,可以联网用来下载,需要注意内存最好要大于1G,我设置的为2G,之前设置的512M内存,编译源码时出现各种问题;
2、apache-ant-1.7.1-bin.zip :下载地址:http://archive.apache.org/dist/ant/binaries/,或者https://pan.baidu.com/s/1kUYa1bp,解压安装路径为:/usr/java/apache-ant-1.7.1;
3、jdk1.7 :下载路径安装路径为https://pan.baidu.com/s/1qZ52wTe,安装路径: /usr/java/jdk1.7;
4、openjdk源码: http://download.java.net/openjdk/jdk7u40/promoted/b43/openjdk-7u40-fcs-src-b43-26_aug_2013.zip?q=download/openjdk/jdk7u40/promoted/b43/openjdk-7u40-fcs-src-b43-26_aug_2013.zip,或者https://pan.baidu.com/s/1o7PMZB8,下载后解压到路径 /home/lxz/openjdk;
PS:
调试一段时候,才知道openjdk是C++变写的代码或者叫源码,可以理解为java代码,可以在VS、NetBeens等工具上调试;
而编译好的代码,类似于java中的class,可以直接在linux上面运行,可以代替安装好的jdk;
所以可以通过VS、NetBeens工具查看、调试openjdk源码,通过查看openjdk源码可以看到JVM调优的一些参数,这些参数可以想象成java代码方法参数;
也可以直接在linux上面调试编译好的代码;
二、下载安装依赖包
四、编译过程中出现的问题
1、时间问题
需要修改源码目录中的CurrencyData.properties文件(/home/lxz/openjdk/jdk/src/share/classes/java/util/CurrencyData.properties),我们需要做的是把文件中以下的时间改为10年内的一个时间(搜索200),比如:2005-12-31-20-00-00中2005改为2015;
2.
遇到错误Error:./gamma: relocation error: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
修改文件:hotspot/make/linux/Makefile
去掉文件中所有的test_gamma即可
五、
用gdb测试上面编译的class文件;
然后在 init.cpp的第95行打个断点,
接着运行,可以看到停在了/root/openjdk/hotspot/src/share/vm/runtime/init.cpp:95;
执行过程如下:
可以对比init.cpp源码文件:
出现以下类似信息:
Missing separate debuginfo for /root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/lib/amd64/server/libjvm.so
因为前面configure没指定"--enable-debug-symbols ZIP_DEBUGINFO_FILES=0"没生成调试的符号信息,或生成后被压缩为"libjvm.diz"了,所有无法找到;
可以去到"libjvm.so"所在目录,然后解压:unzip libjvm.diz
解压出来:libjvm.debuginfo
可调试的虚拟机位置:
openjdk7:源代码目录
build-debug:编译后的二进制文件位置
build-debug/hotspot/outputdir/linux_i486_compiler1/jvmg:虚拟机位置
如果按照Java虚拟机(HOTSPOT)源代码编译步骤进行代码编译,下面的操作之前,请切换到root用户。
解压缩调试符号:
务必要把虚拟机目录下的libjvm.diz里的内容解压到虚拟机所在目录,做一次就可以,不需要每次调试都解压
/home/zxf/openjdk7/build-debug/hotspot/outputdir/linux_i486_compiler1/jvmg的libjvm.diz解压到当前目录中,否则只能进行表层调试,像Threads::create_vm无法break into进去
调试前导入变量:
请将下面shell中/home/zxf/换成你自己的openjdk7源代码目录
export LD_LIBRARY_PATH=/home/zxf/openjdk7/build-debug/hotspot/outputdir/linux_i486_compiler1/jvmg/
export JAVA_HOME=/home/zxf/openjdk7/build-debug/j2sdk-image/
export CLASSPATH=.:/home/zxf/openjdk7/build-debug/j2sdk-image/lib:/home/zxf/openjdk7/build-debug/j2sdk-image/jre/lib
设置断点:
注意下面这个断点设置一定要让gdb开始调试了即r命令后才能设置上。
b Threads::create_vm
GDB调试命令 http://www.linuxidc.com/Linux/2017-01/139028.htm
强大的C/C++ 程序调试工具GDB http://www.linuxidc.com/Linux/2016-09/135171.htm
Linux GDB调试 详述 http://www.linuxidc.com/Linux/2016-11/137505.htm
使用 GDB 恢复堆栈信息 http://www.linuxidc.com/Linux/2017-07/145508.htm
使用GDB命令行调试器调试C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm
GDB调试命令总结 http://www.linuxidc.com/Linux/2016-08/133988.htm
GDB调试工具入门 http://www.linuxidc.com/Linux/2016-09/135168.htm
使用GDB调试Python程序 http://www.linuxidc.com/Linux/2017-11/148329.htm
GDB 的详细介绍:请点这里
GDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149083.htm
到官网选择一个合适的eclipse下载:https://www.eclipse.org/downloads/eclipse-packages/?osType=linux&release=undefined
这里下载的是eclipse-java-neon-1a-linux-gtk-x86_64.tar.gz:https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/1a/eclipse-java-neon-1a-linux-gtk-x86_64.tar.gz&mirror_id=1207
这个还没有开发C++的功能,所有解压打开eclipse后,还需要到"help -> Eclipse Maketplace",搜索"c++"找到Eclipse C++ IDE..安装;
安装后,就可以转到C++开发视图界面了,如下:
File-> New -> Existing Code as Makefile Project
在界面中:
Project Name:hotspot(这个可以自己选择)
Existing Code Location:/root/openjdk/hotspot
Toolchain:选Linux GCC,然后按Finish.
右键工程 -> Debug As -> Debug Configurations -> 右键左边的C/C++ Application -> New -> 进入Main选项卡;
在选项卡中:
Project:hotspot(选择导入的hotspot工程)
C/C++ Application:/root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java(编译生成的openjdk虚拟机入口)
Disable auto build:因为不再在eclipse里面编译hotspot源码,所以这里选上它;
然后切换到Arguments选项卡, 输入Java的参数, 我们这里运行上面的Main类, 于是这里填上 "Test"也就是我们要执行的Java程序
然后切换到Environment选项卡, 添加变量:
JAVA_HOME=/root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/(编译生成JDK所在目录)
CLASSPATH=.:/root/test (Test类文件所在目录)
点击下面的Apply保存;
在hotspot源码工程中找到init.cpp, 在95行打个断点;
运行上面配置的Debug, 可以看到顺利调到了断点;
如图:
注意,如果不能进入断点看前面"2-3";
新建java工程,在工程新建包,在包中新建Test.java文件,测试程序如下:
而运行正常,生成了Test.class文件,如下图:
在前面的5-3配置源码调试的配置上作如下修改;
Arguments选项卡:
com.hotspot.test/Test(注意在前面加上包名,然后是运行类)
Environment选项卡, 修改变量:
CLASSPATH=.:/root/workspace/TestHotspot/bin (java工程生成的bin目录,不包括包名目录)
保存后,点击调试运行hotspot工程,可以看到正常运行了上面的java工程文件,如下:
注意,如果有包名情况下,配置不对,调试运行会报"错误: 找不到或无法加载主类 **";
到这里,我们可以对hotspot虚拟机源码进行调试了……
【参考资料】
1、openjdk文档:openjdk/README-builds.html
2、在Ubuntu14下构建Hotspot并使用Eclipse调试:http://blog.csdn.net/faadfafasd/article/details/50539615
参考链接:
点击打开链接 :http://www.linuxidc.com/Linux/2015-05/117248.htm
点击打开链接 :http://www.cnblogs.com/ACFLOOD/p/5528035.html