openjdk7之编译和debug

编译

  1. 下载源代码
    openjdk的源码可以通过hg方式下载。  
    也可以从此处下载:openjdk源码
  2. 安装引导JDK
    因为JDK中有很多代码是Java自身实现的,所以还需要一个已经安装在本机上可用的JDK,叫做“Bootstrap JDK”。我所选用的Bootstarp JDK是JDK1.6.0_45。  
    java version "1.6.0_45"Java(TM) SE Runtime Environment (build 1.6.0_45-b06)Java HotSpot(TM) Server VM (build 20.45-b01, mixed mode)

    JDK1.6.0_45下载地址:jdk1.6.0_45.tar.gz

  3. 安装编译前的依赖环境
    安装gcc、g++、make等  
    sudo apt-get install build-essential  
    安装ant 1.7以上   
    sudo apt-get install ant  
    安装XRender   
    sudo apt-get install libxrender-dev   
    sudo apt-get install xorg-dev   
    安装alsa   
    sudo apt-get install libasound2-dev  
    Cups   
    sudo apt-get install libcups2-dev   
    安装零碎的工具包   
    sudo apt-get install gawk zip libxtst-dev libxi-dev libxt-dev
  4. 配置编译脚本  
    将你的openjdk解压后,并进入该文件夹。比如我的是在/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk
    下。新建一个build.sh,并添加如下内容:  
    export LANG=C#将一下两项设置为你的BootstrapJDK安装目录export ALT_BOOTDIR=/home/ddy/jdk1.6.0_45export ALT_JDK_IMPORT_PATH=/home/ddy/jdk1.6.0_45#允许自动下载依赖包export ALLOW_DOWNLOADS=true#使用预编译头文件,以提升便以速度export USE_PRECOMPILED_HEADER=true#要编译的内容,我只选择了LANGTOOLS、HOTSPOT以及JDKexport BUILD_LANGTOOLS=trueexport BUILD_JAXP=falseexport BUILD_JAXWS=falseexport BUILD_CORBA=falseexport BUILD_HOSTPOT=trueexport BUILD_JDK=true#要编译的版本export SKIP_DEBUG_BUILD=falseexport SKIP_FASTDEBUG_BUILD=trueexport DEBUG_NAME=debug#避免javaws和浏览器Java插件等的buildBUILD_DEPLOY=false#不build安装包BUILD_INSTALL=false#包含全部的调试信息export  ENABLE_FULL_DEBUG_SYMBOLS=1#调试信息是否压缩,如果配置为1,libjvm.debuginfo会被压缩成libjvm.diz,将不能被debug。export  ZIP_DEBUGINFO_FILES=0#用于编译线程数export  HOTSPOT_BUILD_JOBS=3#设置存放编译结果的目录#export ALT_OUTPUTDIR=/home/ddy/openjdk/7/buildunset CLASSPATHunset JAVA_HOMEmake sanityDEBUG_BINARIES=true make 2>&1

    5.开始编译
    在openjdk目录下,运行build.sh

    chmod +x build.sh./build.sh

    最后编译耗时将近2分钟。编译完成输出如下信息:

    此时openjdk就编译完成了,编译的输出在/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/下。
    进入/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2re-image/bin n,执行
    ./java -version
    输出的java版本信息将是带着你的机器用户名,我的输出是:

    openjdk version "1.7.0-internal-debug"OpenJDK Runtime Environment (build 1.7.0-internal-debug-ddy_2017_06_10_22_30-b00)OpenJDK 64-Bit Server VM (build 24.0-b56-jvmg, mixed mode)

    debug

    编译完成了之后,就可以对JDK源码和HotSpot源码等进行debug了。

    JDK

    首先是JDK源码,在build目录下编译生成的jdk里面的jar包都是可编译的了,直接把eclipse的JDK或者JRE换成编译成功的JDK或者JRE即可。

    HotSpot

    注意,如果不能进入断点,出现以下类似信息:
    Missing separate debuginfo for/root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/lib/amd64/server/libjvm.so
    是因为在编译时因为编译配置项不正确而没有生成调试的符号信息,或生成后被压缩为"libjvm.diz"了,所以无法找到。如果是因为没有编译时没有生成调试信息,需要修改编译配置并重新编译。对于被压缩的情况,可以去到"libjvm.so"所在目录

  • 然后解压:unzip libjvm.diz
  • 解压出来:libjvm.debuginfo

如果在编译时,把配置信息修改如下,则不会出现不能上述问题。

#包含全部的调试信息export  ENABLE_FULL_DEBUG_SYMBOLS=1#调试信息是否压缩,如果配置为1,libjvm.debuginfo会被压缩成libjvm.diz,将不能被debug。export  ZIP_DEBUGINFO_FILES=0

使用GDB

参考:CentOS上编译OpenJDK8源码 以及 在eclipse上调试HotSpot虚拟机源码

使用eclipse

  1. 生成要运行的JAVA类
    首先在/home/ddy/src/java-src目录下建立要运行的FileChannelTest.java,这个类在写文件时调用了JDK的native方法,其代码如下:  
    ```java
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    public class FileChannelTest {

public static void main(String[] args) throws IOException {
FileChannel channel=new RandomAccessFile("test.txt","rw").getChannel();
ByteBuffer buffer=ByteBuffer.allocate(1000);
channel.write(buffer);
}
}
然后对其进行编译,运行:  bash
[email protected] ~ $ cd src/java-src/
[email protected] ~/src/java-src $ pwd
/home/ddy/src/java-src
[email protected] ~/src/java-src $ /home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2sdk-image/bin/javac FileChannelTest.java
```

  1. 下载eclipse,安装C/C++插件 
    到官网选择一个合适的eclipse下载,因为本人主要进行JAVA开发,所以下载的是j2EE版本,这个版本没有C/C++的功能。不过可以安装插件使其支持C/C++功能。"help -> Eclipse Maketplace",搜索"c++"找到Eclipse C++ IDE..安装。安装后,就可以转到C++开发视图界面了。
  2. 导入hotspot工程
    File-> New -> Makefile Project With Existing Code
    在界面中:
    Project Name:openjdk(这个可以自己选择)
    Existing Code Location:/root/openjdk
    Toolchain:选Linux GCC,然后按Finish.
  3. 配置源码调试
  • init.cpp(/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/hotspot/src/share/vm/runtime目录下) 95行
  • FileDispatchImpl.c(/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/jdk/src/solaris/native/sun/nio/ch目录下) 107行
  1. 右键工程 -> Debug As -> Debug Configurations -> 右键左边的C/C++ Application -> New -> 进入Main选项卡;
    在选项卡中:
    Project: openjdk(选择导入的openjdk工程)
    C/C++ Application: /home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2sdk-image/bin/java(编译生成的openjdk虚拟机入口)
    Disable auto build:因为不再在eclipse里面编译hotspot源码,所以这里选上它;
  2. 然后切换到Arguments选项卡, 输入Java参数, 这里填上 "FileChannelTest"也就是我们要执行的JAVA程序。
  3. 然后切换到Environment选项卡, 添加变量
    JAVA_HOME=/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2sdk-image(编译生成JDK所在目录)
    CLASSPATH=.:/home/ddy/src/java-src (FileChannelTest.java文件所在目录)
    点击下面的Apply保存;
  4. 断点Debug
     下面分别在源码上打两个断点:

然后开始debug。首先是第一个断点:F8进行到下一个断电点:从上图可以看到,FileChannel.write()最后调用的是write()操作系统调用。所以,大家现在可以随便debug HotSpot的源码和JDK的native源码了。酷!

时间: 2024-11-05 06:07:00

openjdk7之编译和debug的相关文章

Keil中使用宏编译来定义DEBUG输出

使用宏编译来格式化调试信息,是一个不错的方法,即可以在需要的时候打印出信息,还可以格式化我们所需要的输出. #define DEBUG 1 #if (DEBUG == 1) #define DBG(Args...) printf(##Args) #define DBGFL(s, Args...) printf("[%s:%d]"##s, __FILE__, __LINE__, ##Args) #else #define DBG(Args...) #define DBGFL(s, Arg

XE7 UP1编译Android Debug时报 “failed to allocate 190397160 bytes for output file: Not enough space”

一个项目,一直编译成Android Debug时没有问题,今天加了一个Frame,在WIN下调试正常时,转为编译输出Android Debug时报下面的错误 [DCC Error] E2597 D:\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: fatal err

在用VC编译下debug和release的什么区别

DEBUG和RELEASE 版本差异及调试相关问题:.         内存分配问题 1.          变量未初始化.下面的程序在debug中运行的很好. thing * search(thing * something)        BOOL found;        for(int i = 0; i < whatever.GetSize(); i++)          {          if(whatever[i]->field == something->field

openjdk7的编译

第一步安装依赖 执行如下shell # 因为我已经装了ant和jdk(注意这个jdk,所以不再安装) sudo apt-get install buildessential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev 第二步下载安装bootstrap jdk 下载地址:http:/

windows下vc编译和debug nginx

总体来说,各个步骤以及版本参考官方文档http://nginx.org/en/docs/howto_build_on_win32.html一点没错,有些细节没说清楚. To build nginx: Start MSYS bash. Check out nginx sources from the hg.nginx.org repository. For example: 必须使用源代码仓库中的版本,tar.gz发行包中的虽然是源码,但是不包含windows平台库,否则会提示缺少windows相

在linux下编译openjdk7

最近刚开始看<深入理解JAVA虚拟机>这本书.第一章的实践是自己手动编译openjdk7,但书上的步骤都是基于windows的,于是在网上搜了一下linux下编译openjdk的资料: http://blog.csdn.net/kindazrael/article/details/7266314 http://guoh.org/lifelog/2011/05/compile-openjdk-by-yourself/ 这辆篇文章都说的比较详细.其实,最好的文档是openjdk源码包中的READM

JVM-Ubuntu18.04.1下编译OpenJDK8

近期开始学习JVM,看的是周老师的<深入理解Java虚拟机>,打算先自己编译个JDK来提升对JVM的兴趣.本文分三部分来描述编译OpenJDK的过程,分别是编译前准备工作.构建编译环境.进行编译,在这三部分内容中顺带把趟的坑一起说明下. 一.编译前准备工作 1.1 安装Linux环境 编译OpenJDK,Windows环境要比Linux环境复杂,故选择安装Linux环境.可以自己在Windows下安装虚拟机,也可以直接安装双系统,专门空出一个磁盘来安装Linux,我选择了后者,安装最新版的Ub

Windows下VC编译OpenDDS

OpenDDS是一个OMG组织DDS标准的C++开源实现,OpenDDS同时也提供Java支持.OpenDDS依赖ACE抽象层来提供不同平台的兼容性,同时也依赖于TAO(例如TAO的IDL编译器).当前OpenDDS有ociweb ObjectComputing维护,官方网站http://www.opendds.org/.目前OpenDDS支持的平台有Windows,Linux family,Android,VxWorks等,可用的编译器包括VC,gcc,QNX gcc等. 1. OpenDDS

我为什么要自己编译openjdk8以及那些坑

我为什么要自己编译openjdk8以及那些坑 这是笔者第二次编译openjdk, 第一次编译的是openjdk7,那么好多人会好奇,为什么要自己编译openjdk呢,官方不是已经发布了安装包了么? 要回答这个问题就要明白c\c++是什么?Java又是什么? 记得有位业内同行说过,C++和Java之间隔着一堵由内存管理围成的墙,里面的人想出去,外面的人想进来.笔者从业多年确实见过不少内存管理高手,但是还是有一部分朋友是不喜欢内存管理的,但是如果想成为C++大牛,这关恐怕绕不过去.笔者第一次编译op