Android Studio for Platform(ASfP)には、以下のような処理を行える強力なデバッガが用意されています。
- デバッグするデバイスを選択します。
- Java、Kotlin、C/C++、Rust のコード内にブレークポイントを設定する。
- 実行時に変数や式を検証する。
デバッガを使用する前に、ビルドをデバイスまたはエミュレータにフラッシュする必要があります。
アプリ プロセス(Java/Kotlin)のデバッグ
Java アプリケーション プロセスまたは Kotlin アプリケーション プロセスをデバッグするには:
ASfP 内の Java または Kotlin コードにブレークポイントを設定します。
メニューから [Run] > [Attach Debugger to Android Process] を選択します。
[Choose Process] ダイアログで、[Debug type] が [Java Only] に設定されていることを確認します。
リストからデバイスを選択します。
デバッグする特定のアプリケーション プロセスを選択します。
[OK] をクリックします。
デバイスでアプリケーションを操作して、ブレークポイントにヒットさせます。
システム プロセス(C/C++)のデバッグ
C または C++ で記述されたシステム プロセスをデバッグするには:
実行中のデバイスまたはエミュレータが 1 つだけであることを確認します。
ターミナルを開き、AOSP チェックアウトのルートから
adb rootを実行します。bash adb root
ASfP 内の C/C++ コードにブレークポイントを設定します。
メニューから [Run] > [Attach Debugger to Android Process] を選択します。
[Choose Process] ダイアログで、[Debug type] を [Native Only] または [Dual (Java + Native)] に変更します。
[Show all processes] チェックボックスをオンにすると、システム プロセスが表示されます。
リストからデバイスを選択します。
デバッグする特定のシステム プロセス(
surfaceflingerやsystem_serverなど)を選択します。[OK] をクリックします。
デバイスを操作してブレークポイントに到達します。
Rust のデバッグ
ASfP は、LLDB で Debug Adapter Protocol(DAP)を使用した Rust デバッグをサポートしています。このセクションでは、CodeLLDB をデバッグ アダプタ サーバーとして設定し、ホストと Android デバイスで Rust コードをデバッグする方法について説明します。
CodeLLDB をデバッグ アダプタ サーバーとして設定する
新しい Debug Adapter Protocol 実行/デバッグ構成を作成します。
- メニューから [Run] > [Edit Configurations] を選択します。
- [+] ボタンをクリックします。
- [Debug Adapter Protocol] を選択します。
[サーバー] タブで、[新しいサーバーを作成] をクリックします。
新しく開いたダイアログで、[Choose template] をクリックし、リストから [CodeLLDB] を選択します。
CodeLLDB テンプレートを選択すると、事前定義された構成で新しいサーバーが追加されます。
- [トレース] プルダウンで [詳細] を選択して、詳細トレースを有効にします。
- Android ソースの事前ビルドで
lldb-serverへのパスを指定する環境変数を追加します。
LLDB_DEBUGSERVER_PATH=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/runtimes_ndk_cxx/x86_64/lldb-server ``` Replace `REPO_ROOT` with the absolute path to your Android source checkout. To find `CLANG_VERSION`, run the `get_clang_version.py` script from the root of your Android source tree: ```bash ./build/soong/scripts/get_clang_version.py<<insert base directory>>セクションは変更しないでください。
ホストで Rust バイナリをデバッグする
- Debug Adapter Protocol の実行/デバッグ構成で [Configuration] タブを開きます。
- [デバッグモード] として [起動] を選択します。
- [Working directory] を更新し、デバッグする [Binary file] を選択します。
- [OK] をクリックして構成を保存します。
- 構成の横にある [Debug] アイコンをクリックして、デバッグ セッションを開始します。
このコマンドを初めて実行すると、CodeLLDB がダウンロードされます。コンソールに DAP トレースが表示されます。Rust コードに設定されたブレークポイントは、想定どおりにヒットします。
Android デバイスで Rust バイナリをデバッグする(アタッチ モード)
PID を確認する: Android デバイスでデバッグするアプリケーションのプロセス ID(PID)を確認します。
デバイスで lldb-server を起動します。Android ソースツリー チェックアウトのルートから、
lldbclient.pyスクリプトを実行します。<PID>はプロセス ID に置き換えます。lldbclient.py --setup-forwarding vscode-lldb -p <PID>このスクリプトは、正しい
lldb-serverをデバイスにプッシュして起動し、ポート転送(ホストポート 5039 からデバイス)を設定して、次のステップに必要な DAP JSON 構成を出力します。このターミナルは開いたままにしておきます。ホストで CodeLLDB デバッグ アダプタを起動します。
- CodeLLDB 拡張機能のディレクトリ(デフォルト:
~/.lsp4ij/dap/codelldb/extension/adapter)に移動します。 - 必要な環境変数を設定し、アダプタ サーバーを起動します。
REPO_ROOTとCLANG_VERSIONは、サーバー設定で決定した値に置き換えます。
# Sets PYTHONHOME env variable export PYTHONHOME=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3 # Tell the dynamic linker where to find python libs export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3/lib # Starts the CodeLLDB Debugger Adapter server on port 1234 ./codelldb --liblldb REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/lib/liblldb.so --port 1234- CodeLLDB 拡張機能のディレクトリ(デフォルト:
ASfP DAP クライアントを構成します。
- ASfP の Debug Adapter Protocol Run/Debug 構成に戻ります。
- [構成] タブを選択します。
- [デバッグモード] を [アタッチ] に設定します。
- [アドレス] を
localhostに設定します。 - [ポート] を
1234に設定します。 lldbclient.pyコマンド(ステップ 2)の JSON 出力を [DAP parameters (JSON)] フィールドに貼り付けます。
[Debug] をクリックしてデバッグ セッションを開始します。
トラブルシューティング
- エラー
error: Connection shut down by remote side while waiting for reply to initial handshake packetが表示された場合は、現在のデバッグ セッションを終了し、デバイスのlldb-serverとホストの CodeLLDB アダプタを再起動します。