摘要:來驗(yàn)證下命令小結(jié)編譯版需要的命令下載全部源代碼編譯閱讀和調(diào)試代碼我們使用編譯了源代碼,目錄下會(huì)生成等調(diào)試信息文件。使用使用命令行工具太原始了,下閱讀和調(diào)試更加方便。
原文:http://nullwy.me/2018/02/buil...編譯 OpenJDK
如果覺得我的文章對(duì)你有用,請(qǐng)隨意贊賞
關(guān)于編譯 OpenJDK 官方文檔有很好的介紹,http://openjdk.java.net/group...,匯總了 JDK 6, JDK 7, JDK 8, JDK 9 的 build OpenJDK 的 README 文件。編譯 JDK 8 需要 Xcode 4,現(xiàn)在 Xcode 版本已遠(yuǎn)高于 4 了,前人嘗試編譯發(fā)現(xiàn)有很多坑 [doc, blog ],所以本文直接開始嘗試編譯 OpenJDK 9。OpenJDK 9 源碼根目錄下的 README 文件有如下提示信息(github, hg):
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 就是本文的主要參考來源。
長(zhǎng)話短說 TL;DRbuilding.md 首先給如下的 TL;DR:
$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9 $ cd jdk9 $ bash get_source.sh # 下載全部源代碼 $ bash configure # configure 編譯環(huán)境,若編譯報(bào)錯(cuò),需要添加 `--disable-warnings-as-errors` $ make images # 編譯 OpenJDK
現(xiàn)在就按照,這個(gè)幾個(gè)命令嘗試。
注意,如果運(yùn)行 bash get_source.sh 時(shí)出現(xiàn)類似以下錯(cuò)誤,是網(wǎng)絡(luò)問題造成,多運(yùn)行幾次 bash get_source.sh,直到不出現(xiàn)錯(cuò)誤為止。
WARNING: langtools exited abnormally (255) WARNING: nashorn exited abnormally (255)
若不想使用 hg clone 加 get_source.sh 下載全部源代碼,可以從 OpenJDK 的 github 鏡像(非官方)下載:
$ git clone -b jdk9/jdk9 https://github.com/dmlloyd/openjdk.git
下載好全部源代碼后,接下來需要運(yùn)行 bash configure,控制臺(tái)最后輸出:
··· 省略 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,除了默認(rèn)的 release,還有 fastdebug, slowdebug 和 optimized 這三個(gè)調(diào)試級(jí)別 [doc ]。現(xiàn)在試試 slowdebug 這個(gè)調(diào)試級(jí)別:
$ 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) ... 省略
現(xiàn)在開始編譯這個(gè) OpenJDK,運(yùn)行 make images。但是會(huì)報(bào)如下的編譯錯(cuò)誤:
/Users/yulewei/jdk9/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:167:12: error: instantiation of variable "TreeChunk>::_min_tree_chunk_size" required here, but no definition is available [-Werror,-Wundefined-var-template] return _min_tree_chunk_size; ^
對(duì)個(gè)這個(gè)編譯錯(cuò)誤,configure 命令后需要添加的 --disable-warnings-as-errors [doc, mail.openjdk ],即將原先的命令修改為:
$ bash configure --disable-warnings-as-errors --with-debug-level=slowdebug $ make images
但依然報(bào)錯(cuò),如下:
/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 搜索這個(gè)編譯錯(cuò)誤,發(fā)現(xiàn) OpenJDK 官方早就有人提了相關(guān) bug,JDK-8174050 和 JDK-8187787。至于如何修改,可以參考,hg 316854ef2fa2 或這 git 鏡像 a05122a。
這個(gè)錯(cuò)誤是 XCode 版本不一致造成的,博主機(jī)器運(yùn)行的版本是 9.0,而文檔上說 Mac 下 JDK 9 的代碼是用 XCode 8.3.2 和 --disable-warnings-as-errors 編譯成功的 [doc ]。
修改這 3 個(gè) cpp 文件代碼后,重新運(yùn)行 configure 和 make,不出意外的話,就可以編譯成功。等待十幾分鐘后,最后一行輸出:
... 省略 Finished building target "images" in configuration "macosx-x86_64-normal-server-release"
全部編譯結(jié)果都在 build/macosx-x86_64-normal-server-slowdebug 目錄下。來驗(yàn)證下:
$ 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)命令小結(jié)
編譯 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閱讀和調(diào)試 HotSpot 代碼
我們使用 slowdebug 編譯了 jdk 源代碼,build 目錄下會(huì)生成 java.dSYM、javac.dSYM、libjava.dylib.dSYM、libjvm.dylib.dSYM 等調(diào)試信息文件。有這些調(diào)試信息文件,就可以用 gdb 或者 lldb 調(diào)試 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 下閱讀和調(diào)試更加方便。但是 CLion 目前只支持 cmake,不支持 make 項(xiàng)目。Google 下,發(fā)現(xiàn) JDK 10 下有個(gè)官方分支 JDK-8177329-cmake-branch,能生成 CMakeLists.txt [mail, README-cmake.md ],但博主嘗試生成 CMakeLists.txt,失敗了。只好退而求其次,使用簡(jiǎn)單的 CMakeLists.txt 文件,好讓 CLion 能語法索引整個(gè) HotSpot 項(xiàng)目,方便在 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})參考資料
Building OpenJDK https://github.com/dmlloyd/op...
2018-01 自己動(dòng)手,在macOS High Sierra中編譯一個(gè)可debug的JDK https://juejin.im/post/5a6d7d...
openjdk code compilation/ IDE setup https://stackoverflow.com/a/4...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71769.html
摘要:占用率太高,還出各種奇怪問題,轉(zhuǎn)投調(diào)試安裝下載源代碼漫長(zhǎng)等待,中間無數(shù)次中斷安裝安裝可選如果要使用解釋器,需要安裝設(shè)置調(diào)試級(jí)別,設(shè)成可以提供更多的調(diào)試信息設(shè)置路徑 Intellij CLion CPU 占用率太高,還出各種奇怪問題,轉(zhuǎn)投 Xcode 調(diào)試 hotspot 安裝 hg # brew install hg 下載 open jdk 9 源代碼 # hg clone http...
摘要:準(zhǔn)備工作假設(shè)源代碼目錄為編譯時(shí)啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機(jī)入口中設(shè)斷點(diǎn),然后在的方法中設(shè)置斷點(diǎn)通過宏獲取當(dāng)前,然后創(chuàng)建第個(gè)棧幀,然后進(jìn)入解釋執(zhí)行字節(jié)碼 準(zhǔn)備工作 假設(shè) openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時(shí)啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...
閱讀 1715·2021-11-02 14:47
閱讀 3661·2019-08-30 15:44
閱讀 1350·2019-08-29 16:42
閱讀 1743·2019-08-26 13:53
閱讀 945·2019-08-26 10:41
閱讀 3476·2019-08-23 17:10
閱讀 615·2019-08-23 14:24
閱讀 1729·2019-08-23 11:59