OpenJDK を開発したりソースを見ていると、関数やクラスの定義を追いたくなったり、実行しながら動作を確認したくなることがあります。 多くのエンジニア達は vi や grep 、gdb を使ってるそうです。私にとってCUIでの開発はハードルが高くてかなりつらいので、私は Eclipse CDT (C/C++ Development Tooling) を使って開発してます。JJUG CCC 2017 Spring で、情報を共有して欲しいとの声があったのでここに簡単にまとめました。
1. OpenJDK のビルド
ビルド手順の詳細はこちらを参照してください。
OpenJDK を Linux でビルドする - #chiroito ’s blog
JDK 10 をビルドするコマンドを抜粋すると以下の通りのコマンドを実行します。JDK10_DIR で指定しているディレクトリは OpenJDK のソースを格納するディレクトリですので、任意の場所を設定してください。
JDK10_DIR=/home/chiroito/repo/jdk10-hs hg clone http://hg.openjdk.java.net/jdk10/hs ${JDK10_DIR} cd ${JDK10_DIR} bash get_sources.sh bash configure --with-debug-level=slowdebug --with-native-debug-symbols=internal make images
2. Eclipse へインポート
Eclipse を起動し、[File]-[Import] を選択してインポートダイアログを開きます。[Existing Code as Makefile Project] を選択し[Next>]を押します。
[Project Name] はEclipse上だけで使用する名前なので任意の名前を付けましょう。[Existing Code Location] は先ほど JDK10_DIR に指定したディレクトリを指定します。[Toolchain for Indexer Settings]は Linux GCC を選択します。
これだけで関数やクラスを指定して F3 を押せば、それらの定義へジャンプできます。
3. Eclipse 上でデバッグ
ソースコード中の任意の箇所でブレークポイントします。今回の例では compileBroker.cpp ファイルの 1742 行目に設定します。この行は codecache_print 関数の中です。
それではデバッグ実行してみましょう。[Run]-[Debug Configurations…]でデバッグ実行を設定します。まずは左側で[C/C++ Application] を選択します。[C/C++ Application]には実行ファイルを指定します。実行ファイルは JDK10_DIR に指定したディレクトリ以下の build/linux-x86_64-normal-server-slowdebug/images/jdk/bin/java です。デフォルトでは実行時に毎回ビルドするようになっているので[Disable auto build]にチェックを入れて自動ビルドを無効化しましょう。
次に[Arguments]タブで実行時引数を設定します。[Program arguments:]では java コマンドを実行する際に指定する引数を全て記載します。
ここまで設定すれば準備は完了です。実行してみるとブレークポイントを設定した行で止まります。右側の[Debug]を見るとスレッドごとの関数の呼び出し階層も設定した箇所になり、下側の[Variables] では止めた時点の変数も確認できます。