編譯與調試 OpenJDK

原文: http://nullwy.me/2018/02/buil...
若是以爲個人文章對你有用,請隨意讚揚

編譯 OpenJDK

關於編譯 OpenJDK 官方文檔有很好的介紹,http://openjdk.java.net/group...,彙總了 JDK 6, JDK 7, JDK 8, JDK 9 的 build OpenJDK 的 README 文件。編譯 JDK 8 須要 Xcode 4,如今 Xcode 版本已遠高於 4 了,前人嘗試編譯發現有不少坑 [doc, blog ],因此本文直接開始嘗試編譯 OpenJDK 9。OpenJDK 9 源碼根目錄下的 README 文件有以下提示信息(github, hg):html

For information about building OpenJDK, including how to fully retrieve all
source code, please see either of these:

  * common/doc/building.html   (html version)
  * common/doc/building.md     (markdown version)

common/doc/building.html 和 common/doc/building.md 就是本文的主要參考來源。java

長話短說 TL;DR

building.md 首先給以下的 TL;DRlinux

$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9
$ cd jdk9
$ bash get_source.sh   # 下載所有源代碼
$ bash configure       # configure 編譯環境,若編譯報錯,須要添加 `--disable-warnings-as-errors`
$ make images          # 編譯 OpenJDK

如今就按照,這個幾個命令嘗試。git

注意,若是運行 bash get_source.sh 時出現相似如下錯誤,是網絡問題形成,多運行幾回 bash get_source.sh,直到不出現錯誤爲止。github

WARNING: langtools exited abnormally (255)
WARNING: nashorn exited abnormally (255)

若不想使用 hg cloneget_source.sh 下載所有源代碼,能夠從 OpenJDK 的 github 鏡像(非官方)下載:macos

$ git clone -b jdk9/jdk9 https://github.com/dmlloyd/openjdk.git

下載好所有源代碼後,接下來須要運行 bash configure,控制檯最後輸出:bash

··· 省略

A new configuration has been successfully created in
/Users/yulewei/jdk9/build/macosx-x86_64-normal-server-release
using default settings.

Configuration summary:
* Debug level:    release
* HS debug level: product
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc.yulewei.jdk9-hg (9-internal)

Tools summary:
* Boot JDK:       java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home)
* Toolchain:      clang (clang/LLVM)
* C Compiler:     Version 9.0.0 (at /usr/bin/clang)
* C++ Compiler:   Version 9.0.0 (at /usr/bin/clang++)

Build performance summary:
* Cores to use:   8
* Memory limit:   16384 MB

能夠看到 Debug level: release,除了默認的 release,還有 fastdebug, slowdebugoptimized 這三個調試級別 [doc ]。如今試試 slowdebug 這個調試級別:markdown

$ bash ./configure --with-debug-level=slowdebug
... 省略
A new configuration has been successfully created in
/Users/yulewei/CODING/openjdk/openjdk-git/build/macosx-x86_64-normal-server-slowdebug
using configure arguments '--with-debug-level=slowdebug'.

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

如今開始編譯這個 OpenJDK,運行 make images。可是會報以下的編譯錯誤:網絡

/Users/yulewei/jdk9/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:167:12: error: instantiation of variable 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::_min_tree_chunk_size' required here, but no definition is available [-Werror,-Wundefined-var-template]
    return _min_tree_chunk_size;
           ^

對個這個編譯錯誤,configure 命令後須要添加的 --disable-warnings-as-errors [doc, mail.openjdk ],即將原先的命令修改成:app

$ bash configure --disable-warnings-as-errors --with-debug-level=slowdebug
$ make images

但依然報錯,以下:

/Users/yulewei/jdk9/hotspot/src/share/vm/memory/virtualspace.cpp:585:14: error: ordered comparison between pointer and zero ('char *' and 'int')
  if (base() > 0) {
      ~~~~~~ ^ ~
...
/Users/yulewei/jdk9/hotspot/src/share/vm/opto/lcm.cpp:42:35: error: ordered comparison between pointer and zero ('address' (aka 'unsigned char *') and 'int')
  if (Universe::narrow_oop_base() > 0) { // Implies UseCompressedOops.
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~ 
...
/Users/yulewei/jdk9/hotspot/src/share/vm/opto/loopPredicate.cpp:915:73: error: ordered comparison between pointer and zero ('const TypeInt *' and 'int')
      assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int() >= 0, "must be");
                                              ~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~

使用 Google 搜索這個編譯錯誤,發現 OpenJDK 官方早就有人提了相關 bug,JDK-8174050JDK-8187787。至於如何修改,能夠參考,hg 316854ef2fa2 或這 git 鏡像 a05122a

這個錯誤是 XCode 版本不一致形成的,博主機器運行的版本是 9.0,而文檔上說 Mac 下 JDK 9 的代碼是用 XCode 8.3.2 和 --disable-warnings-as-errors 編譯成功的 [doc ]。

修改這 3 個 cpp 文件代碼後,從新運行 configuremake,不出意外的話,就能夠編譯成功。等待十幾分鍾後,最後一行輸出:

... 省略
Finished building target 'images' in configuration 'macosx-x86_64-normal-server-release'

所有編譯結果都在 build/macosx-x86_64-normal-server-slowdebug 目錄下。來驗證下:

$ build/macosx-x86_64-normal-server-slowdebug/jdk/bin/java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-adhoc.yulewei.jdk9-hg)
OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.yulewei.jdk9-hg, mixed mode)

命令小結

編譯 debug 版 OpenJDK 須要的命令:

$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9
$ cd jdk9
$ bash get_source.sh   # 下載所有源代碼
$ bash configure --disable-warnings-as-errors --with-debug-level=slowdebug
$ make images          # 編譯 OpenJDK

閱讀和調試 HotSpot 代碼

咱們使用 slowdebug 編譯了 jdk 源代碼,build 目錄下會生成 java.dSYMjavac.dSYMlibjava.dylib.dSYMlibjvm.dylib.dSYM 等調試信息文件。有這些調試信息文件,就能夠用 gdb 或者 lldb 調試 HotSpot 了。

lldb java
(lldb) b main
Breakpoint 1: 19 locations.
(lldb) run
Process 6276 launched: '/Users/yulewei/jdk9/build/macosx-x86_64-normal-server-slowdebug/jdk/bin/java' (x86_64)
Process 6276 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100001813 java`main(argc=1, argv=0x00007fff5fbfef98) at main.c:98
   95      {
   96          int margc;
   97          char** margv;
-> 98          const jboolean const_javaw = JNI_FALSE;
   99      #endif /* JAVAW */
   100
   101         JLI_InitArgProcessing(!HAS_JAVA_ARGS, const_disable_argfile);
Target 0: (java) stopped.
(lldb) source info
Lines found in module `java
[0x0000000100001813-0x0000000100001817): /Users/yulewei/CODING/jdk9/jdk/src/java.base/share/native/launcher/main.c:98:20

使用 CLion

使用命令行工具太原始了,CLion 下閱讀和調試更加方便。可是 CLion 目前只支持 cmake,不支持 make 項目。Google 下,發現 JDK 10 下有個官方分支 JDK-8177329-cmake-branch,能生成 CMakeLists.txt [mail, README-cmake.md ],但博主嘗試生成 CMakeLists.txt,失敗了。只好退而求其次,使用簡單的 CMakeLists.txt 文件,好讓 CLion 能語法索引整個 HotSpot 項目,方便在 CLion 下閱讀代碼。CMakeLists.txt 文件以下:

cmake_minimum_required(VERSION 3.7)
project(hotspot)

include_directories(
        src/share/vm
        src/os/linux/vm
        src/cpu/x86/vm
        src/os_cpu/linux_x86/vm
        src/share/vm/precompiled)

file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
add_executable(hotspot ${SOURCE_FILES})

參考資料

相關文章
相關標籤/搜索