概要
Bazelはclient/serverアーキテクチャになっています。bazelコマンドを実行すると、まずクライアントが実行されます。クライアントは実行中のサーバーを検出(見つからない場合は新しくプロセスを起動)してbuildやtestの指示を送信する役割を担っています。実際にbuildやtestの実行はサーバーサイドで実施します。サーバーサイドのコードはJavaで記述されており、Java Debug Wire Protocol (JDWP)に準拠したdebuggerを利用することが可能です。
想定する環境
Bazelの実行環境は、リモートにあるサーバーとします(今回はUbuntu20.04を利用)。手元のローカルPC(Mac OS)にBazelプロジェクトをクローンしたあと、IntelliJを使ってJDWPによるリモートデバッグを行います。
デバッグ方法
まず、リモートサーバー上でbazelコマンドを実行します。コマンドを実行する際、デバッグしたいコマンドの引数に --host_jvm_debug を付与します。これにより、JVMは5005番ポートでdebuggerを待ち受けます。以下coverageコマンドの例を記載していますが、buildやtestも同じようにデバッグできます。
bazel --host_jvm_debug coverage //apps/demo:lib_test--host_jvm_debug を付与した場合、debuggerと接続が確率されるまで処理は開始されませんので次の手順に進みます。
続いて、ローカルPCでsshコマンドを実行して、ローカルの5005番ポートをリモートサーバーの5005番ポートに Port forward します。ローカルでBazel コマンドを実行している場合、この操作は必要ありません。
ssh [USERNAME]@[HOSTNAME] -Nf -L 5005:localhost:5005ローカルPCにてBazelプロジェクトを IntelliJ で起動し、Remote JVM Debug の設定を実施します。
Host: localhost と Port: 5005 を入力することで、Port forward でリモートサーバーの5005番ポートに接続します。

デバッグを開始すると、リモートサーバーと接続が確立されてBazelの処理が実行されます。ご自身のデバッグしたい部分のコードにブレークポイントを設定すればサーバー側のデバッグができます。
Bazelのコードを全て読むのは難しいので、公式のガイドを参照してご自身の気になる部分を追ってみるのが良いと思います。
注意点
リモートサーバーのBazelとクローンしてきたBazelプロジェクトのバージョンを一致させておかないと正しくコード位置が認識されないことがありますのでご注意ください。