在MacOS系統(tǒng)上編譯OpenJDK12并使用CLion調(diào)試

最近在看synchronized 鎖優(yōu)化方面的內(nèi)容,有些地方看起來(lái)不是很方便,干脆就編譯個(gè)源碼來(lái)看看填帽。

在windows上編譯

由于自己常用的電腦操作系統(tǒng)是win10,所以最開(kāi)始是想要在win10上編譯的,但是一來(lái)網(wǎng)上文章太少,二來(lái)在windows上編譯確實(shí)麻煩太多了(windows可以參考深入理解JVM虛擬機(jī)這本書),故放棄了蛛淋。

MAC環(huán)境

macos.png

準(zhǔn)備

獲取源碼

OpenJDK源碼使用Mercurial管理,如果通過(guò)版本庫(kù)下載,則需要安裝Mercurial,我們借助homebrew包管理器來(lái)安裝

brew install mercurial

如果你的電腦沒(méi)有安裝homebrew,那么可以使用下面的命令來(lái)安裝

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝完成后使用以下命令clone源代碼

cd ~/jvm
hg clone https://hg.openjdk.java.net/jdk/jdk12

命令運(yùn)行之后,openjdk的源碼并沒(méi)有下載下來(lái)

由于我并沒(méi)有使用hg的方式,關(guān)于這部分可以參考閃電俠的文章http://www.reibang.com/p/ee7e9176632c

當(dāng)然我非常不建議你使用Mercurial的方式下載,這種方式不久要等很久,而且還需要科學(xué)上網(wǎng)才穩(wěn)妥。我墻裂推薦你直接通過(guò)頁(yè)面下載OpenJdk12源碼壓縮包)

openjdk12-source-code.png

比如我下載的是gz格式的文件(選擇什么格式并不重要)篡腌。

如果你使用的Chrome,那么可以開(kāi)啟多線程下載,速度會(huì)有一個(gè)很明顯的提升褐荷。

Bootstrap JDK

因?yàn)镺penJDK的各個(gè)組成部分有的是使用C++編寫的,有的是使用Java編寫的,因此編譯這些Java代碼需要使用到一個(gè)可用的JDK,官方稱這個(gè)JDK為“Bootstrap JDK",一般來(lái)說(shuō)只需要比編譯的JDK第一個(gè)版本,這里采用OpenJDK11,可以通過(guò)這個(gè)網(wǎng)址 https://jdk.java.net/archive/ 下載
記住一定要下載一個(gè)適合Mac平臺(tái)的OpenJDK11。

我使用的Bootstrap JDK版本如下

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

安裝依賴

# 用于生成shell腳本的工具,可以使軟件包在不同的系統(tǒng)下都可以編譯
brew install autoconf

# 字體引擎
brew install freetype

XCode 和 Command Line Tools for Xcode

這兩個(gè)SDK提供了OpenJDK所需的編譯器以及Makefile中用到的外部命令嘹悼。一般電腦上都自帶安裝了叛甫。

網(wǎng)上很多編譯出錯(cuò)都是因?yàn)閄Code版本問(wèn)題,導(dǎo)致報(bào)錯(cuò),我也遇到了這個(gè)坑。

configure: error: No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK

/Users/.../.../xxx.sh: line 82: 5: Bad file descriptor

configure exiting with result code 1

最終我通過(guò)官網(wǎng)下載https://developer.apple.com/download/more/安裝了9.4.1版本的XCode才搞定了杨伙。

下載xcode需要登錄,如果沒(méi)有賬號(hào)可以申請(qǐng)一個(gè)

我選擇的是手動(dòng)下載xcode安裝的方式,你可以先只下載Command Line Tools (macOS 10.13) for Xcode 9.4.1 安裝看能不能解決你的問(wèn)題,如果不能再下載Xcode(這個(gè)很大,大概4個(gè)多G)

download-xcode.png

編譯jdk

源碼下載好之后,我解壓放到了這個(gè)/Users/naver/jvm/jdk12-06222165c35f目錄下,下面的命令均是在這個(gè)目錄下執(zhí)行的其监。

bash configure  --with-boot-jdk='/usr/local/jdk-11.0.2.jdk/Contents/Home' --with-debug-level=slowdebug --with-target-bits=64 --disable-warnings-as-errors --enable-dtrace --with-jvm-variants=server

--with-boot-jdk:指定Bootstrap JDK路徑
--with-debug-level:編譯級(jí)別,可選值為release、fastdebug缀台、slowdebug和optimized,默認(rèn)值為release,如果我們要調(diào)試的話,需要設(shè)定為fastdebug或者slowdebug,建議設(shè)置為slowdebug
--with-target-bits:指定編譯32位還是64位的虛擬機(jī)
--disable-warnings-as-errors:避免因?yàn)榫娑鴮?dǎo)致編譯過(guò)程中斷
--enable-dtrace:開(kāi)啟一個(gè)性能工具
--with-jvm-variants:編譯特定模式下的虛擬機(jī),一般這里編譯server模式
--with-conf-name:指定編譯配置的名稱,如果沒(méi)有指定,則會(huì)生成默認(rèn)的配置名稱macosx-x86_64-server-slowdebug,我這里采用默認(rèn)生成配置

在很多場(chǎng)景下編譯OpenJDK都會(huì)使用--enable-ccache參數(shù),來(lái)通過(guò)ccache加快編譯速度,但我沒(méi)有采用,因?yàn)槟壳熬幾g速度其實(shí)不慢,再有就是如果增加了這個(gè)參數(shù),后續(xù)導(dǎo)入到CLion的時(shí)候,會(huì)出現(xiàn)很多紅字提示,看著好像不影響使用,但總歸看著不太舒服

生成Compilation Database

在配置CLion的時(shí)候,直接import編譯好之后的jdk源碼,你會(huì)發(fā)現(xiàn)頭文件都是紅色的,無(wú)法找到提示,是因?yàn)镃Lion生產(chǎn)的CMakeLists.txt有問(wèn)題,如果想要解決這個(gè)問(wèn)題就需要修改這個(gè)文件,很明顯我不會(huì)修棠赛。

最后通過(guò)JetBrains說(shuō)的利用Compilation Database (https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/) 在CLion中構(gòu)建OpenJDK解決了這個(gè)問(wèn)題哮奇。

make CONF=macosx-x86_64-server-slowdebug compile-commands

執(zhí)行完該命令,就會(huì)在${source_root}/build/macosx-x86_64-server-slowdebug下生成compile_commands.json文件膛腐。


compile_commands_json.png

編譯

在導(dǎo)入CLion之前,要編譯一下,因?yàn)槟承┠K使用了預(yù)編譯頭,如果不編譯,CLion會(huì)在索引過(guò)程中提示找不到各種各樣的文件。

make CONF=macosx-x86_64-server-slowdebug

測(cè)試

open-jdk-version.png

至此,證明我們已經(jīng)編譯完成了JDK12

CLion調(diào)試

導(dǎo)入project

在導(dǎo)入project之前先配置好Toolchains(Preferences進(jìn)入)

toolchains.png

配置好Toolchains后,通過(guò)File -> Open功能,選中${source_root}/build/macosx-x86_64-server-slowdebug/compile_commands.json,As a project打開(kāi),這樣就導(dǎo)入了Compilation Database文件,接下來(lái)CLion開(kāi)始進(jìn)行索引鼎俘。

這時(shí)候,你會(huì)發(fā)現(xiàn)你是看不到源碼的,所以下面需要修改項(xiàng)目的根目錄,通過(guò)Tools -> Compilation Database -> Change Project Root功能,選中你的源碼目錄,也就是${source_root},這樣設(shè)置就可以在CLion中看到源代碼啦哲身。

${source_root}指的是 /Users/naver/jvm/jdk12-06222165c35f

debug之前配置

需要在Preferences --> Build, Exceution, Deployment --> Custom Build Targets配置構(gòu)建目標(biāo)

build.png
clean.png

由于我這里已經(jīng)配置好了,所以這里顯示的是編輯頁(yè)面,第一次配置要點(diǎn)擊+,進(jìn)行新增即可。

通過(guò)這兩個(gè)配置每次構(gòu)建之前都會(huì)重新編譯我們的jdk,修改jvm代碼之后可以直接進(jìn)行重新調(diào)試贸伐。

debug 配置

debug_config.png

Executable:選擇${source_root}/build/macosx-x86_64-server-slowdebug/jdk/bin/java,或者其它你想調(diào)試的文件,比如javac勘天;
Before luanch:這個(gè)下面新增的時(shí)候有一個(gè)bug,去掉就不會(huì)每次執(zhí)行都去Build,節(jié)省時(shí)間,但其實(shí)OpenJDK增量編譯的方式,每次Build都很快,所以就看個(gè)人選擇了。

debug

${source_root}/src/java.base/share/native/libjli/java.c的401行打斷點(diǎn),點(diǎn)擊Debug,然后F9放掉,不出意外你會(huì)遇到下面這個(gè)問(wèn)題

debug-sigsegv.png

由于我們使用的LLDB進(jìn)行debug的,所以在進(jìn)入第一個(gè)斷點(diǎn)的時(shí)候在LLDB下執(zhí)行以下命令可以避免此類問(wèn)題

pro hand -p true -s false SIGSEGV SIGBUS
lldb-pro-hand.png

最終就可以看到j(luò)ava -version的輸出效果如下

java-version.png

不過(guò)每次debug的時(shí)候都要輸入這么一句就很麻煩,所以我們可以在~/.lldbinit文件中,使用如下命令,實(shí)現(xiàn)每次Debug時(shí)自動(dòng)打個(gè)斷點(diǎn),然后輸入pro hand -p true -s false SIGSEGV SIGBUS,最后繼續(xù)執(zhí)行后續(xù)流程,文件內(nèi)容如下(其中main.c文件的路徑自行替換)

breakpoint set --file /Users/naver/jvm/jdk12-06222165c35f/src/java.base/share/native/launcher/main.c --line 98 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true

與Java程序聯(lián)合debug

上面演示的實(shí)際是java -version如何debug,那么如何做到通過(guò)自己編寫的java代碼作為程序入口來(lái)調(diào)試呢捉邢?

首先java代碼如下(我用idea編寫的):

java-code.png

CLion中配置如下

debug-java-code.png

運(yùn)行結(jié)果如下:

debug-java-code-result.png

參考文檔

<<深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐>>
mac下編譯openjdk1.9及集成clion動(dòng)態(tài)調(diào)試
在MacOS系統(tǒng)上使用CLion編譯并調(diào)試OpenJDK

關(guān)注我不迷路

你的關(guān)注是對(duì)我最大的鼓勵(lì),是兄弟就關(guān)注我(狗頭保命)


gzh.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脯丝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伏伐,更是在濱河造成了極大的恐慌宠进,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藐翎,死亡現(xiàn)場(chǎng)離奇詭異材蹬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吝镣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門堤器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人末贾,你說(shuō)我怎么就攤上這事闸溃。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵辉川,是天一觀的道長(zhǎng)掂为。 經(jīng)常有香客問(wèn)我,道長(zhǎng)员串,這世上最難降的妖魔是什么勇哗? 我笑而不...
    開(kāi)封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮寸齐,結(jié)果婚禮上欲诺,老公的妹妹穿的比我還像新娘。我一直安慰自己渺鹦,他們只是感情好扰法,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著毅厚,像睡著了一般塞颁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吸耿,一...
    開(kāi)封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天祠锣,我揣著相機(jī)與錄音,去河邊找鬼咽安。 笑死伴网,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妆棒。 我是一名探鬼主播澡腾,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糕珊!你這毒婦竟也來(lái)了动分?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤红选,失蹤者是張志新(化名)和其女友劉穎澜公,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纠脾,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玛瘸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苟蹈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糊渊。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慧脱,靈堂內(nèi)的尸體忽然破棺而出渺绒,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布宗兼,位于F島的核電站躏鱼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏殷绍。R本人自食惡果不足惜染苛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望主到。 院中可真熱鬧茶行,春花似錦、人聲如沸登钥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牧牢。三九已至看锉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塔鳍,已是汗流浹背伯铣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留献幔,地道東北人懂傀。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓趾诗,卻偏偏與公主長(zhǎng)得像蜡感,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恃泪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360