はじめに
Rails開発でデバッグする時、binding.irb
をコードに埋め込んじゃいますよね。
僕もずっとそうだったんですが、毎回コードを書き換えるのが面倒だったり、うっかり消し忘れてコミットしそうになったり...なんてことも。
「もっと楽に、イマドキな感じでデバッグできないかな?」と思って調べてみたら、Rubyの標準デバッガーrdbg (debug gem)
とVisual Studio Code (VSCode)
を連携させる、とても便利な方法があることを知りました。
この記事では、デバッグ環境の構築に挑戦した手順を、備忘録も兼ねてまとめてみました。
この環境が作れると、VSCodeの画面上でブレイクポイントを設定するだけで好きな場所で処理を止められて、変数の中身もリアルタイムで確認できるようになります。binding.irb
の手軽さとはまた違った快適さで、デバッグがとても捗りました!
環境
- Rails 8.0.2
- Ruby 3.4.3
- Docker
- OS Mac
構築手順
Step 1:debug gem
のインストール
まず、デバッグに必要な debug gem をプロジェクトに追加します。
Gemfile
を開き、:development
, :test
グループに以下の行を追記してください。
group :development, :test do
gem "debug"
# ... 他のgem
end
追記したら、Docker コンテナ内で bundle install を実行して gem をインストールします。
docker compose run --rm web bundle install
Step 2: VSCodeに拡張機能をインストール
次に、VSCodeがrdbgと通信するために必要な拡張機能をインストールします。
VSCode の拡張機能タブを開きます。
「VSCode rdbg Ruby Debugger」と検索します。
Koichi Sasada さんによって公開されている拡張機能をインストールします。
Step 3: docker-compose.yml
の設定
Dockerコンテナ内で起動したrdbg
に、ホストマシン(あなたのPC)のVSCodeから接続できるように、ポートフォワーディングの設定を行います。
docker-compose.yml
ファイルのRailsアプリケーションを動かしているサービス(ここではweb
とします)に、以下の設定を追加します。
services:
web:
# ... (build, volumesなどの設定)
command: bash -c "rm -f tmp/pids/server.pid && rdbg -n --open --host 0.0.0.0 --port 34567 -c -- bundle exec rails s -p 3000 -b '0.0.0.0'"
ports:
- "3000:3000"
- "34567:34567" # 👈 デバッグ用にこの行を追加
コマンドの解説:
-
rm -f tmp/pids/server.pid
: これは重要なおまじないです。コンテナを強制終了した際などに残ってしまう古いサーバープロセスIDファイルを起動時に削除し、「A server is already running.」というエラーを防ぎます -
rdbg --open ...
:rdbg
を起動します-
--open
: デバッガーのフロントエンド(今回はVSCode)からの接続を待ち受けます -
-c
: デバッグを開始するコマンド (--command) のエイリアスです -
--host 0.0.0.0
: Docker コンテナ外からの接続を受け付けるために必要です -
-p 34567
: 待機するポートを指定します -
-- bin/rails s -b 0.0.0.0
: rdbg 経由で実行するコマンドです
-
-
34567:34567
:rdbg
起動時に立ち上げるポートです。ホストとコンテナで同じポート番号をマッピングします
Step 4: VSCode のデバッグ設定(launch.json
)
いよいよ VSCodeのデバッグ設定を行います。
この設定ファイルに「どのようにデバッガーを起動し、コンテナに接続するか」を記述します。
-
VSCode のアクティビティバーから「実行とデバッグ」アイコンをクリックします
-
「
launch.json
ファイルを作成します」というリンクをクリックし、デバッガーの選択肢が表示されたらrdbg
を選びます
-
.vscode/launch.json
というファイルが自動で作成されるので、その内容を以下のように書き換えます
{
"version": "0.2.0",
"configurations": [
{
"type": "rdbg",
"name": "Attach to Docker Container",
"request": "attach",
"debugPort": "localhost:34567",
"localfsMap": "${workspaceFolder}",
}
]
}
-
type
:rdbg
を指定します。インストールした拡張機能に対応します -
name
: デバッグ構成の分かりやすい名前です(例: "Attach to Docker Container") -
request:
attach`を指定します。すでに起動しているデバッグプロセスに接続するためです -
debugPort
:rdbg
が待機しているポートを指定します。docker-compose.yml
で設定したものと同じ localhost:34567 を指定します -
localfsMap
: ホストマシン上のプロジェクトのパスを指定します。${workspaceFolder} は VSCode で開いているフォルダのルートパスを指す変数で、通常はこのままでOKです
Step 5: デバッグの実践!
すべての設定が完了しました。実際にデバッグを動かしてみましょう!
-
デバッグモードでRailsサーバーを起動
Railsサーバーを起動すると、ログにDEBUGGER: Debugger can attach via TCP/IP (0.0.0.0:34567)
と出力されます。 -
VSCodeからデバッガーにアタッチ
-
VSCodeの 「実行とデバッグ」パネル を開きます
-
画面上部のプルダウンメニューから、先程
launch.json
で設定した名前(Attach to Docker Container
)を選択します
成功すると、VSCode の下部にオレンジ色のステータスバーが表示され、デバッグツールバーが出現します。これで接続は完了です!
VScode上のデバッグツールの操作については、割愛しますが、ブレイクポイントで処理を停止することで、以下のようなことができます。
-
変数の確認
: 左側の「変数」パネルで、ローカル変数やインスタンス変数の中身をリアルタイムで確認できます -
ステップ実行
: 上部のデバッグツールバーで、一行ずつ処理を進めたり(ステップオーバー)、メソッドの中に入ったり(ステップイン)できます -
デバッグコンソール
: デバッグコンソールで直接 Ruby コードを実行し、その時点での変数の状態を操作することも可能です
VScodeのデバッグツールの操作については、以下のような記事を確認してみてください。
VScodeデバッグツールの使い方
まとめ
最後までお読みいただき、ありがとうございました!
僕もこの方法を初めて知った時、「もっと早く知りたかった!」と心から思いました。エラーの原因が分からず長時間悩んでいたのが、嘘のように解決できた経験があります。
あなたにとっても、このデバッグ環境が「難しいエラーを解決できた!」という成功体験に繋がれば、とても嬉しいです。
他にこういった設定方法あるよ!とかコメントで教えていただければありがたいです。