1. 程式人生 > >寫了那麼多年 Java 程式碼,終於 debug 到 JVM 了

寫了那麼多年 Java 程式碼,終於 debug 到 JVM 了

繼上篇文章 原創 | 全網最新最簡單的 openjdk13 程式碼編譯 之後,我們有了自己編譯後的 jdk 和 hotspot,如下圖所示。接下來就來幹一番事情。

搭建除錯環境

1.下載 CLion 軟體

Jetbrains 是一家非常牛逼的公司,咱 Java 裡面用到的 IDEA 功能很強大,這公司也為 C/C 提供一個 IDE,名叫 CLion,咱需要下載這個 IDE 來除錯 JVM 原始碼。

2.匯入原始碼

安裝完 CLion 之後,咱就可以先匯入程式碼,下面簡單記錄一下操作步驟。

選擇 New CMake Project from Sources。

開啟我們下載 OpenJDK13 的目錄,我的目錄是 /opt/java/openjdk/jdk13

接下來有彈框點選 Next 就行了,等待匯入原始碼完成(需要幾分鐘,可以喝杯茶)。

3.啟動配置

導完原始碼後,我們需要配置啟動程式,這裡有些配置需要重新指定,主要有下面 2 點。

  • Executable 修改為咱們編譯後的 java 程式。

  • Build 需要刪除掉。

4.打下斷點

我們在 thread.cpp 程式碼的 Threads::create_vm 方法打下斷點。

5.開始 Debug

點選 Debug 按鈕,開始除錯我們的 JVM 程式碼。可以看到我們打的斷點生效了,如下圖所示。

恭喜,我們成功除錯 JVM 程式碼。不過發現了下面這個異常資訊,解決它。

6.發現這個異常

按 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 來編譯,然後在程式執行引數那裡指定。下面舉個例子。

1.編寫 Test 程式碼

我們編寫一個簡單的 Hello JVM 程式,程式碼如下。

public class Test {

    public static void main(String[] args) {
        System.out.println("hello jvm");
    }
}

2.javac 編譯

通過我們編譯後的 JDK 命令 javac Test.java 來編譯。

liebrother@liebrother:/opt/java/openjdk/jdk13/build/linux-x86_64-server-release/jdk/bin$ ./javac Test.java

3.配置啟動引數

然後在 Clion 程式啟動配置那裡指定我們的類 Test。

結果就是我們的程式被運行了。

以上就是我們今天要講的在 JVM 層面上除錯我們自己寫的程式。

總結

總結一下搭建這套 JVM 環境。搭建過程中其實沒有很波折,官方文件寫的很清晰(雖然都是英文的),這 2 篇文章也是盡最大的努力,把一些步驟簡化,也截圖保留下來,一方面給自己回顧的機會,一方面也是給有想要搭建這套環境的朋友們一個捷徑。這套環境接下來的定義是:給自己深入瞭解 JVM 的機會,在遇到某些知識點不清晰,不明白原理的時候,就可以看一看原始碼,揪出源頭的邏輯。

非常建議朋友們搭建這麼一套環境,也不要怕 JVM 裡面都是 C/C 程式碼,可能剛開始看的時候會很費勁,看多了就習慣了。

推薦閱讀

寫了那麼多年 Java 程式碼,終於 debug 到 JVM 了

全網最新最簡單的 openjdk13 程式碼編譯

瞭解Java執行緒優先順序,更要知道對應作業系統的優先順序,不然會踩坑

執行緒最最基礎的知識

老闆叫你別阻塞了

吃個快餐都能學到序列、並行、併發

泡一杯茶,學一學同異步

程序知多少?

設計模式看了又忘,忘了又看?

後臺回覆『設計模式』可以獲取《一故事一設計模式》電子書

覺得文章有用幫忙轉發&點贊,多謝朋友們!