繼上篇文章 原創 | 全網最新最簡單的 openjdk13 代碼編譯 以後,咱們有了本身編譯後的 jdk 和 hotspot,以下圖所示。接下來就來幹一番事情。java
Jetbrains 是一家很是牛逼的公司,咱 Java 裏面用到的 IDEA 功能很強大,這公司也爲 C/C++ 提供一個 IDE,名叫 CLion,咱須要下載這個 IDE 來調試 JVM 源碼。linux
安裝完 CLion 以後,咱就能夠先導入代碼,下面簡單記錄一下操做步驟。設計模式
選擇 New CMake Project from Sources。併發
打開咱們下載 OpenJDK13 的目錄,個人目錄是 /opt/java/openjdk/jdk13
。異步
接下來有彈框點擊 Next 就好了,等待導入源碼完成(須要幾分鐘,能夠喝杯茶)。jvm
導完源碼後,咱們須要配置啓動程序,這裏有些配置須要從新指定,主要有下面 2 點。ui
java
程序。 咱們在 thread.cpp
代碼的 Threads::create_vm
方法打下斷點。spa
點擊 Debug 按鈕,開始調試咱們的 JVM 代碼。能夠看到咱們打的斷點生效了,以下圖所示。操作系統
恭喜,咱們成功調試 JVM 代碼。不過發現了下面這個異常信息,解決它。線程
按 F9 讓程序繼續跑,咱們發現 Console 出現了下面紅框的一行字。
這是 GDB 的異常信息,咱們能夠經過在咱們的用戶目錄下添加配置來解決這個問題。建立 ~/.gdbinit
文件,添加以下配置。
handle SIGSEGV nostop noprint pass
handle SIGBUS nostop noprint pass
handle SIGFPE nostop noprint pass
handle SIGPIPE nostop noprint pass
handle SIGILL nostop noprint pass複製代碼
再運行就不會有這個異常信息了。
上面已經調通了咱們編譯的 JVM 源碼,有同窗可能想知道,那要調試本身寫的代碼得怎麼操做呢?咱們上面已經看到 Debug 到 JVM 源碼了,咱們本身的代碼則能夠經過咱們編譯後的 JDK 來編譯,而後在程序執行參數那裏指定。下面舉個例子。
咱們編寫一個簡單的 Hello JVM 程序,代碼以下。
public class Test {
public static void main(String[] args) {
System.out.println("hello jvm");
}
}複製代碼
經過咱們編譯後的 JDK 命令 javac Test.java 來編譯。
liebrother@liebrother:/opt/java/openjdk/jdk13/build/linux-x86_64-server-release/jdk/bin$ ./javac Test.java複製代碼
而後在 Clion 程序啓動配置那裏指定咱們的類 Test。
結果就是咱們的程序被運行了。
以上就是咱們今天要講的在 JVM 層面上調試咱們本身寫的程序。
總結一下搭建這套 JVM 環境。搭建過程當中其實沒有很波折,官方文檔寫的很清晰(雖然都是英文的),這 2 篇文章也是盡最大的努力,把一些步驟簡化,也截圖保留下來,一方面給本身回顧的機會,一方面也是給有想要搭建這套環境的朋友們一個捷徑。這套環境接下來的定義是:給本身深刻了解 JVM 的機會,在遇到某些知識點不清晰,不明白原理的時候,就能夠看一看源碼,揪出源頭的邏輯。
很是建議朋友們搭建這麼一套環境,也不要怕 JVM 裏面都是 C/C++ 代碼,可能剛開始看的時候會很費勁,看多了就習慣了。
推薦閱讀
寫了那麼多年 Java 代碼,終於 debug 到 JVM 了
瞭解Java線程優先級,更要知道對應操做系統的優先級,否則會踩坑
後臺回覆『設計模式』能夠獲取《一故事一設計模式》電子書
以爲文章有用幫忙轉發&點贊,多謝朋友們!