OpenJDKをhg clone
したあと、bin/idea.sh
を実行して、IntelliJ IDEAでソースコードを読んでいました。ただ、C++のコードを読む割合が増えてきて、IntelliJでは読みづらいな、と感じてきました。
以前chiroitoさんが、Eclipse上でOpenJDKをデバッグしていたことを思い出し、
そうだ、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さんから、教えていただきました。
LinuxのHotSpotは正常状態でもSEGVを積極的に活用します。それではなくて?
— Yasumasa Suenaga (@YaSuenag) December 28, 2018
たしかに、SIGSEGVで止まってはいますが、デバッガはアタッチできています。何度かResumeしたところ、ブレークポイントまで進みました!YaSuenagさん、ありがとうございます!