編譯jdk和使用clion調(diào)試jdk

前言

我們都知道java程序是運(yùn)行在jvm虛擬機(jī)上的欺殿,jdk里面很多native方法的實(shí)現(xiàn)都是在jvm源碼里面的。那么jvm是如何加載類(lèi),如何創(chuàng)建對(duì)象卷中,線程同步的本質(zhì)是什么?那些看不見(jiàn)的native方法到底干了什么渊抽?這些疑問(wèn)使用baidu或許能了解個(gè)大概蟆豫。但通過(guò)百度獲取的知識(shí),如果自己沒(méi)有消化懒闷,只是臨時(shí)解決某個(gè)問(wèn)題十减,或者面試的時(shí)候背誦一下。我想這是無(wú)意義的愤估。因?yàn)檫^(guò)了一段時(shí)間后帮辟,你會(huì)忘了它。甚至一點(diǎn)印象都沒(méi)有了灵疮。那么怎么把這些知識(shí)深深的刻在腦海里呢织阅。其實(shí)我覺(jué)得沒(méi)必要。為什么要記住這些死板的知識(shí)點(diǎn)呢震捣。舉個(gè)例子荔棉,面試的時(shí)候面試官可能會(huì)問(wèn)你java nio底層依賴的epoll機(jī)制一共有涉及幾個(gè)系統(tǒng)調(diào)用闹炉。答案是epoll_createepoll_ctl润樱,epoll_wait這三個(gè)渣触。但真的有必要記住他們嗎。我想也就大概面試的時(shí)候會(huì)用到吧壹若。而且還是面試一般開(kāi)發(fā)崗位的時(shí)候會(huì)問(wèn)到嗅钻。其實(shí)找下jdk源碼不就知道了,沒(méi)必要刻意記住這些東西店展。接下來(lái)我會(huì)使用幾篇文章講解如何搭建本地jvm的調(diào)試環(huán)境养篓,如何調(diào)試native方法。如何調(diào)試jvm啟動(dòng)過(guò)程赂蕴。當(dāng)然這些只是打開(kāi)jvm大門(mén)的鑰匙柳弄。要想深入理解還需要一點(diǎn)一滴的積累。

環(huán)境準(zhǔn)備

我的操作系統(tǒng):mac os Big Sur 版本11.4

  1. 下載clion概说,我的版本是2019.3.6
  2. git clone openjdk12
  3. 安裝jdk11碧注,編譯jdk12需要使用引導(dǎo)的jdk,否則會(huì)提示Your Boot JDK version must be one of 11,12

編譯jdk

進(jìn)入openjdk的根目錄執(zhí)行

bash configure --disable-warnings-as-errors --with-debug-level=slowdebug --with-jvm-variants=server
make images
# disable-warnings-as-errors選項(xiàng)是禁止把warning 當(dāng)成error
# --with-debug-level=slowdebug糖赔。用來(lái)設(shè)置編譯的級(jí)別萍丐,可選值為release、fastdebug放典、slowde-bug逝变,越往后進(jìn)行的優(yōu)化措施就越少,帶的調(diào)試信息就越多刻撒。默認(rèn)值為release骨田。slowdebug 含有最豐富的調(diào)試信息,沒(méi)有這些信息声怔,很多執(zhí)行可能被優(yōu)化掉,我們單步執(zhí)行時(shí)舱呻,可能看不到一些變量的值醋火。所以最好指定slowdebug 為編譯級(jí)別。
# with-jvm-variants 編譯特定模式的HotSpot虛擬機(jī)箱吕,可選值:server芥驳、client、minimal茬高、core兆旬、zero、custom

configure 命令承擔(dān)了依賴項(xiàng)檢查怎栽、參數(shù)配置構(gòu)建輸出目錄結(jié)構(gòu)等多項(xiàng)職責(zé)丽猬,如果編譯過(guò)程中需要的工具鏈或者依賴項(xiàng)有缺失宿饱,命令執(zhí)行后會(huì)得到明確的提示,并給出該依賴的安裝命令脚祟。

漫長(zhǎng)的等待之后谬以,一個(gè)自己的jdk誕生了。它的目錄結(jié)構(gòu)是這個(gè)樣子的

image-20210707074153901

使用clion調(diào)試hotspot虛擬機(jī)

下面的操作主要參考這篇博客https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/

compilation database 這個(gè)功能大概的意思就是clion默認(rèn)是用cmake由桌,但是編譯openjdk是用make为黎,可以通過(guò)下面這個(gè)辦法解決

If you are working with a project which is not based on CMake, Gradle, or Makefiles, you can still benefit from the advanced IDE features that CLion provides. One way is to import a non-CMake project and let CLion convert it into a simple CMake structure. Another option is to open a project by loading its compilation database

生成compile_commands.json文件

make compile-commands

使用CLion File=> Open => 選擇文件

/jdk12/build/macosx-x86_64-server-slowdebug/compile_commands.json

選擇open as Project

這時(shí)候,你會(huì)發(fā)現(xiàn)你是看不到源碼的行您,所以下面需要修改項(xiàng)目的根目錄铭乾,通過(guò)Tools -> Compilation Database -> Change Project Root功能,選中你的源碼目錄娃循,也就是jdk12

Custom Build Targets
image-20210707075906913
image-20210707092254331
image-20210707080037987
Run/Debug configurations
image-20210707080310143

設(shè)置斷點(diǎn)炕檩,進(jìn)行debug

image-20210321183529036.png

此處只是簡(jiǎn)單地演示了java -version如何debug。那如果是一個(gè)普通的java程序如何debug呢淮野。

寫(xiě)一個(gè)測(cè)試程序如下:

public class Demo {
    public static void main(String[] args) throws Exception {
        LockSupport.park();
    }
}

查看源碼發(fā)現(xiàn)park方法實(shí)際調(diào)用的是Unsafe類(lèi)的park方法捧书。而這個(gè)native方法的源代碼位于/jdk12/src/hotspot/share/runtime/park.hpp下,它的實(shí)現(xiàn)類(lèi)是/jdk12/src/hotspot/os/posix/os_posix.cpp骤星。配置調(diào)試程序的參數(shù)经瓷。

image-20210706213127925

os_posix.cpp中設(shè)置斷點(diǎn)。

image-20210706213257341

可以看出最終調(diào)用pthread_cond_wait這個(gè)系統(tǒng)調(diào)用洞难,線程等待在那里舆吮。

這只是一個(gè)簡(jiǎn)單的例子演示了如何使用Clion調(diào)試java程序。按照這個(gè)方法就可以對(duì)任何native方法進(jìn)行單步調(diào)試队贱。

IDEA配合Clion遠(yuǎn)程調(diào)試

上面我們實(shí)現(xiàn)了調(diào)試hotspot虛擬機(jī)色冀。如果我想java程序和hotspot虛擬機(jī)一起調(diào)試,該如何實(shí)現(xiàn)呢柱嫌?這就需要使用到j(luò)vm的遠(yuǎn)程debug功能了锋恬。

比如新建一個(gè)簡(jiǎn)單的spring boot項(xiàng)目,使用maven生成可執(zhí)行的jar包编丘。

clion配置如下:

image-20210707110734903

idea配置如下:

image-20210707110821812

這樣不論是在clion下設(shè)置斷點(diǎn)還是在idea下設(shè)置斷點(diǎn)与学,都可以進(jìn)行單步調(diào)試?yán)病?/p>

總結(jié)

這篇文章簡(jiǎn)單介紹了下調(diào)試openjdk的環(huán)境和工具的使用。后面會(huì)出幾期針對(duì)特點(diǎn)知識(shí)點(diǎn)的深入hotspot源碼的解析教程嘉抓。敬請(qǐng)期待索守。

?著作權(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)店門(mén)说敏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丢郊,你說(shuō)我怎么就攤上這事盔沫。” “怎么了枫匾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵架诞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我干茉,道長(zhǎng)谴忧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任角虫,我火速辦了婚禮沾谓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戳鹅。我一直安慰自己均驶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布枫虏。 她就那樣靜靜地躺著妇穴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隶债。 梳的紋絲不亂的頭發(fā)上腾它,一...
    開(kāi)封第一講書(shū)人閱讀 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)封第一講書(shū)人閱讀 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)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至仅胞,卻和暖如春每辟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背干旧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 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

推薦閱讀更多精彩內(nèi)容