[JVM] Ubuntu下手动编译调试Openjdk

标签: java jvm
57人阅读 评论(0) 收藏 举报
分类:

环境

编译环境:Ubuntu 17.10 64位
openjdk版本:openjdk9

编译步骤

安装下载openjdk源码的工具

sudo apt install mercurial

下载源码

$ hg clone http://hg.openjdk.java.net/jdk9/dev 9dev
$ cd 9dev
$ sh ./get_source.sh

由于国内网络原因下载比较慢,下载失败的时候重复执行sh ./get_source.sh直到全部下载完成为止。

安装jdk8

到oracle的官网上下载jdk8,我这里下载的版本是jdk-8u162-linux-x64.tar.gz,解压下载的jdk文件到/opt/java目录下,/opt下没有java目录则手动创建

tar -zxvf jdk-8u162-linux-x64.tar.gz -C /opt/java

设置java环境变量sudo vim /etc/profile编辑profile文件,在文件末尾添加以下内容

export JAVA_HOME=/opt/java/jdk1.8.0_162
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

执行source /etc/profile让我们新增的配置立即生效,执行java -version判断jdk是否安装成功

note: 编译openjdk9需要使用jdk8作为boot jdk,因为我们编译的是openjdk9,最好安装oracle版本的jdk8作为boot jdk,使用openjdk8有可能编译期间会出现各种问题

编译openjdk

执行如下命令来搜集系统配置信息

bash configure --disable-warnings-as-errors --with-debug-level=slowdebug --with-native-debug-symbols=internal

各参数表示的意义如下:

  • –disable-warnings-as-errors 禁用编译器warning当做错误来处理
  • –with-debug-level 设置编译级别,在这里我们要编译为能够debug的版本,因此设为slowdebug
  • –with-native-debug-symbols 生成调试需要debug符号信息,并将这些信息写入到编译生成的二进制文件中,该参数一定要指定,否则用gdb调试的时候会提示找不到符号信息,无法设置断点

当看到如下信息时,说明configure已经成功了

A new configuration has been successfully created in
/home/peter/Study/java/jdk/9dev/build/linux-x86_64-normal-server-slowdebug
using configure arguments '--disable-warnings-as-errors --with-debug-level=slowdebug --with-native-debug-symbols=internal'.

Configuration summary:
* Debug level:    slowdebug
* HS debug level: debug
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc.peter.9dev (9-internal)

Tools summary:
* Boot JDK:       java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)  (at /opt/java/jdk1.8.0_162)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 7.2.0 (at /usr/bin/gcc)
* C++ Compiler:   Version 7.2.0 (at /usr/bin/g++)

Build performance summary:
* Cores to use:   2
* Memory limit:   3922 MB

configure期间可能会提示某些软件尚未安装,根据提示安装即可。configure结束会在源码目录下生成build目录,这里保存了各个编译版本的配置信息。

执行如下命令编译openjdk

make images

image表示编译生成JREJDK镜像,具体更多的编译选项可参考源码目录下的文档common/doc/building.html,当看到如下所示的信息时,表明openjdk已经编译成功了

Finished building target 'images' in configuration 'linux-x86_64-normal-server-slowdebug'

编译的结果在9dev/build/linux-x86_64-normal-server-slowdebug目录下

调试openjdk

我这里是在虚拟机中编译的,配置比较差,因此我这里只用gdb来进行调试,然后在宿主机上使用netbeans来阅读源代码。进入到9dev/build/linux-x86_64-normal-server-slowdebug/jdk/bin,执行如下命令即可开始调试

gdb -tui java

如下图所示
这里写图片描述
在入main函数处设置断点,然后使用gdb命令调试即可,需要注意调试过程可能会多次提示java线程收到了SIGSEGV信号二停止往下执行,这时只要在gdb中执行continue命令即可

(gdb) r
Starting program: /home/peter/Study/java/jdk/9dev/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0x7fffffffe088) at /home/peter/Study/java/jdk/9dev/jdk/src/java.base/share/native/launcher/main.c:95
(gdb) c
Continuing.
[New Thread 0x7ffff7fde700 (LWP 105558)]

Thread 2 "java" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7fde700 (LWP 105558)]
0x00007fffe0dde513 in ?? ()
(gdb) 

或者我们在run之前执行如下命令忽略掉该信号,这样java线程就不会block住了,参考文档segmentation fault in the jvm

handle SIGSEGV noprint
查看评论

JVM源码—教你傻瓜式编译openjdk7

LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试。尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇到不少意料之外的错误。 为了方便各...
  • GarfieldEr007
  • GarfieldEr007
  • 2017-01-12 23:09:54
  • 1866

Ubuntu系统下切换Openjdk7和Openjdk8

随着Android版本的更新,Ubuntu下的Jdk版本也相应随之增多。     Android6.0及以下用的是Openjdk7,而Android7.1则需用Openjdk8。同一个Ubuntu系...
  • daniel80110_1020
  • daniel80110_1020
  • 2017-06-05 20:35:19
  • 1636

在Ubuntu 12.04 上编译调试 OpenJDK8

介绍如何在 ubuntu 12.04 上下载 openjdk8 代码,并编译,调试。
  • on_1y
  • on_1y
  • 2014-08-22 20:34:08
  • 9463

Ubuntu12.04安装配置OpenJDK8

Android7.1 系统编译依赖于 JAVA 8,编译之前需安装 OpenJDK。 第一步:下载jdk-8u91-linux-x64.tar.gz安装包,解压到/usr/lib/jvm/目录下,解...
  • daniel80110_1020
  • daniel80110_1020
  • 2017-06-02 20:45:43
  • 587

ubuntu编译并调试OpenJDK8源码实践

最近打算研究一下 jvm 相关的知识,所以想编译 OpenJDK 的源码,一直在Mac上面编译,但是总是出现莫名其妙的error,还找不到有效的解决方式,所以还是进入 Ubuntu 下面进行编译,虽然...
  • lj188266
  • lj188266
  • 2017-11-28 14:14:42
  • 270

openjdk7的langtools源码

  • 2016年01月30日 11:43
  • 5.94MB
  • 下载

JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译

笔者最近在学习周志明老师编写的《深入理解Java虚拟机》一书,书中第一章的实战部分就是“自己编译JDK”,不过书中提到的是OpenJDK 7的编译。由于现在Java开发主流的JDK基本都是1.8的版本...
  • bmw601055
  • bmw601055
  • 2017-09-07 15:57:51
  • 855

Linux下IDEA无法设置OpenJDK 9为SDK解决方法

前言 之前一直在Linux下用OpenJDK 8开发Java应用,随着JDK 10的发布,想着一直都没有用JDK 9,就安装了OpenJDK 9来试试。安装完OpenJDK 9后到IDEA下设置Pr...
  • ghosind
  • ghosind
  • 2018-03-23 01:31:05
  • 178

openjdk编译及调试

转自:http://my.oschina.net/pkm2012/blog/97610 由于最近想了解下jit和java的解释执行,故需要编译下openjdk跟下代码:下面是环境配置过程,为了以后避...
  • kexinmei
  • kexinmei
  • 2013-08-17 10:05:11
  • 2297

linux下配置java的环境变量(解决默认的openjdk无法修改)

ubuntu下JDK配置本质上和win是一样的: 1、去官网下载JDK7,找jdk-7u21-linux-i586.tar.gz并下载:http://www.oracle.com/technetwo...
  • qiebobobo
  • qiebobobo
  • 2015-06-23 13:21:28
  • 4176
    个人资料
    持之以恒
    等级:
    访问量: 3299
    积分: 178
    排名: 107万+
    文章分类
    文章存档