学习JVM,看的书是<<实战java虚拟机>>,<<深入理解java虚拟机>> 这本书看着有点难,所以没从这里开始看。
首先是下载 JDK的源码并编译,我用的是mac os,但是在mac os上面去安装下载源码的软件的时候比较麻烦,看书上以及其他的文章里面,都是直接在Linux里面进行操作的,所以我也弄一个linux,
使用 vmware 创建centos虚拟机
首先使用vmware创建一个centos虚拟机,
安装jdk
centos 安装和卸载jdk参考 centos下安装和卸载jdk 进行安装,这里需要使用手动安装的方式,下载jdk然后解压到 /opt
目录下,我的文件目录是/opt/jdk1.8.0_291
,这个目录在后面编译jdk源码时会用到。然后配置 /etc/profile
文件中,增加下面的配置,来配置环境变量。
export JAVA_HOME=/opt/jdk1.8.0_291
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
下载源码并编译
下载源码和编译是参考<<实战java虚拟机>> 书和 搭建 JVM(HotSpot) 源码调试环境(OpenJDK8) 这篇文章。
# 安装hg 可以参考 https://blog.csdn.net/wejack/article/details/116308043
yum install mercurial -y
#下载源码
hg clone http://hg.openjdk.java.net/jdk10/jdk10
cd jdk10/
# 调整get_source.sh的权限为可执行
chmod 755 get_source.sh
# 运行 get_source.sh,然后要等一段时间
./get_source.sh
# 给configure文件赋可执行权限
chmod a+x configure
#运行 configure文件,书上给了很多的参数,但是执行后会提示有的参数找不到,参考了文档后,提供这三个参数执行可以成功
./configure --with-boot-jdk=/opt/jdk1.8.0_291/ --with-debug-level=slowdebug --with-native-debug-symbols=internal --disable-warnings-as-errors
# 编译
make images
按书上的步骤操作的时候,在make images 这里,我被卡住了很长的时间,应该就是前面的configure没有正确执行或者是get_source 没有正常执行的原因,一会出现 release,一会出现 fastdebug,然后在make images的时候还提示CONF缺少,重试了好多次,删除又重下了多次jdk10的源码,最后是以上面的命令执行成功的,要按这个顺序执行。
使用gdb进行调试
跳转到编译后生成的目录的bin
目录,执行命令
cd /root/jvmtest/jdk10/build/linux-x86_64-normal-server-slowdebug/jdk/bin
# 用gdb启动java执行程序
[root@hdss7-188 bin]# gdb -args ./java -version
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/jvmtest/jdk10/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java...done.
#这里是在 main函数上打断点
(gdb) b main
Breakpoint 1 at 0x400ad0: file /root/jvmtest/jdk10/jdk/src/java.base/share/native/launcher/main.c, line 97.
# 执行run 继续运行
(gdb) run
Starting program: /root/jvmtest/jdk10/build/linux-x86_64-normal-server-slowdebug/jdk/bin/./java -version
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Breakpoint 1, main (argc=2, argv=0x7fffffffe1d8)
at /root/jvmtest/jdk10/jdk/src/java.base/share/native/launcher/main.c:97
97 {
# 输入n 回车是进行下一步 (n = next)
(gdb) n
102 const jboolean const_javaw = JNI_FALSE;
(gdb) n
108 main_jargc = (sizeof(const_jargs) / sizeof(char *)) > 1
(gdb) n
gdb运行中出的Missing separate debuginfos
问题 ,参考 gdb调试问题Missing separate debuginfos, use: debuginfo-install
解决
Missing separate debuginfos, use: debuginfo-install glibc-2.17-324.el7_9.x86_64 zlib-1.2.7-19.el7_9.x86_64
1、 修改文件/etc/yum.repos.d/CentOS-Debuginfo.repo中的enabled参数,将其值修改为1,
如:vi /etc/yum.repos.d/CentOS-Debuginfo.repo
[base-debuginfo]
name=CentOS-7 - Debuginfo
baseurl=http://debuginfo.centos.org/7/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
# 这个改为1
enabled=1
2、 使用命令:
yum install nss-softokn-debuginfo –nogpgcheck yum-utils -y
3、执行debuginfo-install命令:
debuginfo-install glibc-2.17-324.el7_9.x86_64 zlib-1.2.7-19.el7_9.x86_64