OpenJDK源码调试图文教程

前言

     随着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源码调试的过程就结束了,大家如果有什么问题,可以给我留言,大家共同交流进步。

到此这篇关于OpenJDK源码调试的文章就介绍到这了,更多相关OpenJDK源码调试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • yum安装openJDK1.8后无法卸载的快速解决方法

    一.问题描述 用yum安装openJDK1.8,安装后使用yum remove卸载,提示如下 Remove 1 Package(s) Installed size: 490 k Is this ok [y/N]: y Downloading Packages: Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Erasing : 1:java-1.8.0-

  • Docker 解决openjdk容器里无法使用JDK的jmap等命令问题

    零.问题描述 项目:Java Spring Boot 项目 Docker 环境:Docker Toolbox.不是 Windows10,用不了 Docker for Windows 只能用这个. 使用 Docker Compose 编排服务,并启动 Mysql 和 Spring Boot 项目. docker-compose.yml 文件内容: version: '2' services: mysql: build: ./docker/builds/mysql ports: - "3386:33

  • openjdk与Oraclejdk的区别

    在2006年11月13日的JavaOne大会上,Sun公司(当时还没被收购)宣布计划要把Java开源,在随后的一年多时间内,它陆续地将JDK的各个部分在GPL v2(GNU General Public License v2)协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理.除了极少量的产权代码(Encumbered Code,这部分代码所有权不属于Sun公司,Sun本身也无权进行开源处理)外,OpenJDK几乎拥有了当时SunJDK 的全部代码. OpenJDK的质量主管曾经

  • 麒麟V10更换OpenJDK为Oracle JDK的方法

    1 简介 JDK(Java Development Kit)是 Java 平台编程中使用的软件开发环境.它包含一个完整的 Java 运行时环境,即所谓的私有运行时.该名称来自于它包含的工具多于独立的 JRE 以及开发 Java 应用程序所需的其他组件.常见的有 OpenJDK 和 Oracle JDK OracleJDK 根据 Oracle 二进制代码许可协议获得许可,而 OpenJDK 具有 GNU 通用公共许可证(GNU GPL)版本2. 使用 Oracle 平台时会产生一些许可影响.如 O

  • docker安装openjdk并运行jar包的操作方法

    下载镜像 docker pull openjdk 创建数据卷 创建一个java_app的数据卷 docker volume create java_app 将jar包上传到/var/lib/docker/volumes/java_app/_data/下,然后启动镜像 启动镜像 docker run --name=javaApp --restart=always --network=host \ -v java_app:/usr/src/myapp openjdk java -jar /usr/s

  • 如何卸载linux自带openjdk并安装sun jdk

    参见:https://www.jb51.net/article/112612.htm 检查一下系统中的jdk版本 [hadoop@master ~]$ java -version openjdk version "1.8.0_222-ea" OpenJDK Runtime Environment (build 1.8.0_222-ea-b03) OpenJDK 64-Bit Server VM (build 25.222-b03, mixed mode) 检测jdk安装包 [hadoo

  • Ubuntu如何轻松编译openJDK详解

    前言 花了三天在windows上搞openJDK,对bash本来就不熟,加上各种莫名依赖和脚本里的bug,身心俱疲.最后make all的时候产生一个莫名其妙的错误说什么有warning且-Werror置为了true,死活没google到-Werror是什么鬼,只好作罢了. 今天本菜鸟突然想起来,朕还有Ubuntu虚拟机,权且一试,没想到轻松成功. 平台:Ubuntu Version 5.1.30 (3.2.0-98-generic-pae #138-Ubuntu SMP Mon Jan 11

  • 在CentOS系统上安装Java的openjdk的方法

    CentOS 6.X 和 5.X 自带有OpenJDK runtime environment  (openjdk).它是一个在linux上实现开源的java 平台.CentOS  yum 命令 安装 Java SDK openjdk centos linux JAVA(openjdk)软件包名 1.java-1.7.0-openjdk - OpenJDK Runtime Environment 2.java-1.7.0-openjdk-devel - OpenJDK Development E

  • OpenJDK源码调试图文教程

    前言      随着Java生态愈发庞大,各种各样的新技术层出不穷,这也给大家的学习带来了很多困惑,这么多技术我该学什么,盲目的在各种新技术间穿梭,并不能取得很好的效果.      作为Java核心技术的JDK相信很多同学都看过源码,了解过Java的内存模型,但是很多时候debug到最后都是 native,这是让人很沮丧的事情,于是乎了解JDK底层的实现变得极为重要.     编译OpenJDK源码的文章很多,但是很少有从头到尾搭建环境的文章,于是我这里就写了这篇文章,这里涉及的主要步骤: 虚拟

  • 基于编译虚拟机jvm—openjdk的编译详解

    java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系. 一般情况下开发人员不需要关注虚拟机内部实现就可以日常开发了,但是有时候涉及到性能的时候就需要了解虚拟机的实现机制了. 那么今天写的内容更多的是关于编译一套自己的虚拟机,为日后了解虚拟机底层原理铺铺路. 编译虚拟机可能会遇到很多坑,也很花费时间.也因大家的环境的差异,可能遇到的问题都不一致. 我只能说把自己遇到的问题都列出来,权当抛砖引玉了. 1首先我们应该下载openjdk的源码,这个openjdk实际上是有

随机推荐