OpenJDK源码调试图文教程
作者:Lucky Monkey 发布时间:2022-09-26 01:40:25
前言
随着Java生态愈发庞大,各种各样的新技术层出不穷,这也给大家的学习带来了很多困惑,这么多技术我该学什么,盲目的在各种新技术间穿梭,并不能取得很好的效果。
作为Java核心技术的JDK相信很多同学都看过源码,了解过Java的内存模型,但是很多时候debug到最后都是 native,这是让人很沮丧的事情,于是乎了解JDK底层的实现变得极为重要。
编译OpenJDK源码的文章很多,但是很少有从头到尾搭建环境的文章,于是我这里就写了这篇文章,这里涉及的主要步骤:
虚拟机的安装
虚拟机的安装
Ubuntu系统镜像安装
Ubuntu系统设置
OpenJDK编译
Idea在Linux下的安装
netbeans在Linux下的安装
HotSpot源码调试
WMware虚拟机安装
WMware的版本有很多我们这里使用的版本是15.5.1的版本。
下载链接
链接: https://pan.baidu.com/s/1IABotf1mFjFMZqXE8yZ1BA 提取码: atzw
下载软件后,放到指定目录下,双击打开,点击下一步,如下图所示:
勾选我接受的复选框,点击下一步,如下图所示:
选择待安装vm的磁盘位置,可以自定义,选择磁盘位置后,点击下一步,如下图所示:
去勾选更新和加入体验的复选框,点击下一步,如下图所示:
点击下一步后弹出安装进度,等待安装结束,如下图所示:
到此为止我们就安装成功了,在桌面上找到图标打开即可以使用了,如下图所示:
Ubuntu系统镜像安装
这里用来安装虚拟的Ubuntu的版本是16.04.6这个版本
下载链接
链接: https://pan.baidu.com/s/1X82lDWqBO7HcBD_likFtPQ 提取码: i4y4
打开VMware虚拟机软件,如下图所示:
选择新建虚拟机,如下图所示:
创建虚拟机,选择典型,然后下一步,如下图所示:
选择已下载的ubuntu-16.04.6-desktop-amd64.iso镜像,然后点击下一步,如下图所示:
填写创建Ubuntu虚拟机所需要的的基本信息,然后点击下一步,如下图所示:
填写虚拟机名称和安装位置,这里建议在较大的盘中创建一个单独的目录进行存储,然后点击下一步,如下图所示:
指定磁盘大小和磁盘文件存储形态,如果只是用来进行简单的调试代码默认的20G足够了,如果后面不够可以在虚拟机设置中对其进行调整,这里我们就设置默认的20G,磁盘存储有两种形式单文件和多文件,多文件格式对于备份异常恢复更好,这里我们选择多文件存储,然后点击下一步,如下图所示:
由于后面在编译OpenJDK时对内存要求较高,这里在自定义硬件中我们将内存调整到4G,然后点击完成,如下图所示:
等待Ubuntu安装成功,这个过程大概需要十几分钟,如下图所示:
Ubuntu系统设置
网络设置
输入密码,登录操作系统,如下图所示:
Ubuntu网络设置,使用快捷键(Ctrl+Alt+T)打开命令行窗口,输入ifconfig,查看当前网络配置,如下图所示:
输入route -n,查看网关配置,如下图所示:
查看当前Windows系统的DNS配置,作者使用的是Windows10,如下图所示:
设置Ubuntu的网络配置,如下图所示:
测试使用Ubuntu自带的火狐浏览器是否可以正常访问百度,如下图所示:
共享文件夹设置
虚拟机Ubuntu和Windows进行文件共享,很多资料使用的都是虚拟机自带的工具VMware Tools,但是很多时候操作过程中会出现很多意想不到的问题造成安装失败,浪费很多时间,这里介绍一种更简单的方式,通过网络共享实现虚拟机文件共享。
方法如下:
在Downloads目录下创建一个share文件夹,效果如图所示:
在share文件夹上右键,选择本地网络共享,效果如图所示:
按下图勾选选项,然后点击创建共享按钮,效果如图所示:
在windows系统中通过网络找到share共享目录,效果如图所示:
OpenJDK编译
在编译OpenJDK过程中,需要用到的软件如下:
jdk-7u80-linux-x64.tar
下载地址:
链接: https://pan.baidu.com/s/1LNd2Xkg93bsXDuEVFdjfQQ 提取码: j3ix
openjdk-8u40-src-b25-10_feb_2015.zip
下载地址:
链接: https://pan.baidu.com/s/1eFVhrgmXOZ_oD8uQ_YEiUg 提取码: kqkh
编译流程
将需要的安装包放到虚拟机share共享目录,如下图所示:
在Ubuntu虚拟机中解压安装包到Documents目录,如下图所示:
安装依赖包(按照提示进行操作),大概需要2分钟
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
sudo apt-get install libcups2-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libasound2-dev
安装vim
sudo apt-get install vim
配置path
vim ~/.bashrc
在bashrc文件的末尾添加下面代码,其中jdk1.7.0_80路径根据实际情况填写
export JAVA_HOME=/home/feng/Documents/jdk1.7.0_80
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
验证是否配置成功
source ~/.bashrc
java -version
执行命令编译OpenJDK8,boot jdk按照实际目录填写
cd /home/feng/Documents/openjdk/
sudo bash configure --with-target-bits=64 --with-boot-jdk=/home/feng/Documents/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
如果配置成功会显示如下信息:
执行下面的命令,开始编译,这个时间较长
sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0
看到下面的画面,证明编译成功
Ubuntu下安装Idea
我们这里使用的Idea2021.1的社区版。
下载链接
链接: https://pan.baidu.com/s/1w8eqjpWHn6J0DYX9TAwQmQ 提取码: ygci
将下载的idea,放到share共享目录下,并在虚拟机中解压到Documents目录,截图如下:
在当前用户目录下创建Makefile文件
cd ~
vim Makefile
在文件中添加以下代码:
idea:
sh /home/feng/Documents/idea-IC-211.6693.111/bin/idea.sh
通过make命令启动idea
make idea
启动后,点击继续,截图如下:
选择不发送,截图如下:
Ubuntu下安装NetBeans
我们这里使用的NetBeans8.2的版本。
下载链接
链接: https://pan.baidu.com/s/1k40ZgtSx87rUvLaabazeDA 提取码: 34u9
将下载的NetBeans,放到share共享目录下,并在虚拟机中复制到桌面,截图如下:
执行以下命令,安装NetBeans
cd /home/feng/Desktop/
sudo chown feng:feng jdk-8u111-nb-8_2-linux-x64.sh
./jdk-8u111-nb-8_2-linux-x64.sh
点击下一步,安装NetBeans,如下图所示:
设置默认jdk,点击下一步,如下图所示:
选择初始化目录,点击下一步,如下图所示:
去勾选检查更新,点击安装,如下图所示:
去勾选,点击完成,如下图所示:
点击桌面的NetBeans ISE 8,2启动,如下图所示
安装C/C++插件,如下图所示
选择可用插件,找到C/C++选中,点击安装,如下图所示
点击下一步,安装C/C++插件,如下图所示
勾选同意,点击安装,如下图所示
HotSpot源码调试
执行下面命令,修改javahome,使用编译好的OpenJDK作为默认JDK
vim ~/.bashrc
修改bashrc文件,修改后效果如下图:
export JAVA_HOME=/home/feng/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk
执行java -version命令,检查是否修改成功,如果成功,效果如下
source ~/.bashrc
java -version
使用NetBeans创建OpenJDK工程,步骤如下:
基于现有的C/C++代码创建工程,选择如下图,点击下一步
选择编译后的OpenJDK的目录,选择定制,选择如下图,点击下一步
按照默认配置,点击下一步,最终点击完成
使用Idea,创建一个工程,编写一个测下代码,工程结构,如下图
package com.feng;
public class Test {
public static void main(String[] args) {
String str = "test";
System.out.println(str);
}
}
运行代码进行编译,将class文件生存到class目录下,如下图
NetBeans中配置Test活动,步骤如下:
编辑Run Command,使用如下参数,效果如图:
"${OUTPUT_PATH}" -cp "/home/feng/IdeaProjects/Test/target/classes" com.feng.Test
点击应用,然后点击确认,效果如图:
切换到Test,点击运行,这个时候会弹出选择可执行的命令,这里需要选择编译后的OpenJDK中的java命令,效果如图:
启动成功后,会打印出来我们在idea中编写的Test代码的执行结果,如下图所示:
这个时候我们就可以在OpenJDK中添加断点,对OpenJDK进行调试了,在openjdk->jdk->src->share->bin->java.c文件中JavaMain方法处添加断点进行调试,如下图所示:
到这里整个OpenJDK源码调试的过程就结束了,大家如果有什么问题,可以给我留言,大家共同交流进步。
来源:https://blog.csdn.net/weixin_41452004/article/details/115608385


猜你喜欢
- 本文实例为大家分享了java实现点击按钮事件弹出子窗口的具体代码,供大家参考,具体内容如下要求:1、在父窗口中添加一个按钮2、点击按钮弹出子
- 我们很多时候会碰到这样的问题,使用多线程刷一个表的数据时需要多个线程不能重复提取数据,那么这个时候就需要使用到线程的排他锁了。在c#里面其实
- 前言在开发 Flutter 应用程序时,我们需要有一个组件来管理全局设置,包括主题、导航和路由。这就是 MaterialApp 的用途。作为
- Java中 获取指定字符串在另一个字符串中出现的次数,供大家参考,具体内容如下/** * @param args */ public s
- 今天想和小伙伴们来聊一聊 Spring Security 中的角色继承问题。角色继承实际上是一个很常见的需求,因为大部分公司治理可能都是金字
- 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> &nbs
- 本文实例讲述了C#从windows剪贴板获取并显示文本内容的方法。分享给大家供大家参考。具体如下:using System;using Sy
- 前两天,谷歌发布了Android Studio 1.0的正式版,也有更多的人开始迁移到Android Studio进行开发。然而,网上很多的
- 本文实例为大家分享了Android绘制钟表的具体代码,供大家参考,具体内容如下首先要画一个表,我们要先知道步骤如何:1、仪表盘----外面最
- 第一种方式(只使用Caffeine)gradle添加依赖dependencies { implementation
- 前言开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧。@Slf4j(topic = "c.V
- Sequence序列Sequence 是Kotlin标准库提供的一种容器类型。它和Iterable一样具备对集合进行多步骤操作能力,但是却是
- Java的NIO中的管道,就类似于实际中的管道,有两端,一段作为输入,一段作为输出。也就是说,在创建了一个管道后,既可以对管道进行写,也可以
- 前言不得不说SpringBoot的开发者是在为大众程序猿谋福利,把大家都惯成了懒汉,xml不配置了,连tomcat也懒的配置了,典型的一键启
- 本教程将介绍如何在 Spring Boot 应用程序中使用 Kafka。Kafka 是一个分布式的发布-订阅消息系统,它可以处理大量数据并提
- 需求场景:当数据库中保存的部分数据需要加密,页面需要正常显示时。这是就需要我们自定义类型转换器,在Mybatis执行SQL得到结果时,通过自
- Java RandomAccessFile 指定位置实现文件读取与写入RandomAccessFile是属于随机读取类,是可以对文件本身的内
- Java 线程同步根本上是要符合一个逻辑:加锁------>修改------>释放锁1、同步代码块示例如下:public cla
- 代码思路:想要循环遍历文件夹下所有子文件夹,就要用到递归。首先判断路径是否存在:是:获取文件判断是否文件夹:是:调用自身,继续获取子文件夹下
- SpringBoot 整合 Redis 数据库实现数据缓存的本质是整合 Redis 数据库,通过对需要“缓存&r