Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

OpenJDKのC++コードを、CLionでデバッグする

OpenJDKをhg cloneしたあと、bin/idea.shを実行して、IntelliJ IDEAでソースコードを読んでいました。ただ、C++のコードを読む割合が増えてきて、IntelliJでは読みづらいな、と感じてきました。

以前chiroitoさんが、Eclipse上でOpenJDKをデバッグしていたことを思い出し、

chiroito.hatenablog.jp

そうだ、JetBrainsにはCLionがあるじゃない、C++コードは読みやすくなるだろうし、それでOpenJDKのデバッグまでできればいいな、と考えました。

CMake

OpenJDKはmakeなのですが、CLionは現在のところCMakeベースのプロジェクトのみサポートしています。そのままディレクトリを開いても、シンタックスハイライトされるだけで、関数定義に飛ぶといったことができません。CMakeLists.txtというファイルを作って、それをCLionに読み込ませてやればいいようです。

"OpenJDK CLion"といったワードで検索すると、多少出てきました。

これらに書かれているままでは、読み込めませんでした。OpenJDKのディレクトリ構成が変わっているからです。以下のようにすると、エラーなく終わりました。

cmake_minimum_required(VERSION 3.7)
project(hotspot)
include_directories(
        src/hotspot/cpu
        src/hotspot/os
        src/hotspot/os_cpu
        src/hotspot/share
        src/hotspot/share/precompiled
        src/hotspot/share/include
        src/java.base/unix/native/include
        src/java.base/share/native/include
)
file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
add_executable(hotspot ${SOURCE_FILES})

私が自分で設定したのは、include_directoriesの部分です。

エラーなく終わったとはいえ、ファイルによっては細かいエラーが残っています。関数定義にも飛べるので、IDEを使ってソースを読むレベルまでにはなりました。

別の方法として、New Projectをして、File > Import Projectでソースコードのディレクトリを選択すると、CMakeLists.txtを生成してくれます。以下を参考にしました。

【JVM源码探秘】在Mac上搭建OpenJDK10源码调试环境

私もこの方法をやってみましたところ、CMakeLists.txtが生成され、CLionでのプロジェクト設定ができました。

ブレークポイントを設定してデバッグ実行すると、SIGSEGV

C++のコードに、ブレークポイントを打ちます。Run/Debug Configurationsで、Executableにデバッグシンボルありのjavaコマンドを指定し、Program argumentsに実行するJavaクラスを指定します(-cp /tmp HelloWorldなど)。CLionからデバッグ実行すると…SIGSEGVになります。

ブレークポイントを外して実行したり、Runでの実行だと、SIGSEGVになりません。SIGSEGV = エラーという思い込みがあったのですが、OpenJDK ReviewerのYaSuenagさんから、教えていただきました。

たしかに、SIGSEGVで止まってはいますが、デバッガはアタッチできています。何度かResumeしたところ、ブレークポイントまで進みました!YaSuenagさん、ありがとうございます!

f:id:jyukutyo:20181228144100p:plain