• トップ
  • ブログ一覧
  • Docker環境のRailsをVSCodeでデバッグする方法
  • Docker環境のRailsをVSCodeでデバッグする方法

    はっと(エンジニア)はっと(エンジニア)
    2024.02.21

    IT技術

    はじめに

    今回はdocker環境のRailsをVSCodeからデバッグする方法を解説します。
    VSCodeをインストールしており、docker環境のRailsの構築が完了している前提で話を進めていきます。

    以上の環境が整って入ればVSCodeでデバッグをするのに必要なことは以下になります。

    必要なこと

    debug gemを導入

    VSCode拡張機能「VSCode rdbg Ruby Debugger」を導入

    docker-compose.ymlにデバッグ用の設定を追加

    VSCodeデバッグ用の設定ファイルを作成

    VSCodeデバッグの通信の仕組み

    VSCodeでデバッグをするにはVSCodeとアプリケーションを繋ぐ必要があります。

    ブレークポイントを設定し、処理が止まった所でアプリケーションから変数の値などを受け取りエディタに表示をします。

    図としては以下のような形になります。

    画像引用: VSCode公式

    ただこれでは、プログラミング言語ごとにエディタに送信されるデータが異なるため、エディタ側で複数の異なる仕様に合わせてUIの表示などを実装しなければいけません。

    その対応策として以下の「Debug Adapter Protocol」というプロトコルが生まれたようです。

    画像引用: VSCode公式

    アプリケーションのデバッガーとの間に「Debug Adapter」という仲介役を配置します。

    「Debug Adapter」はアプリケーションのデバッガーからデータを受け取り、「エディタ」とはプロトコルの仕様に沿った通信をします。

    これにより、エディタはどの言語であっても同じ仕様に沿ったデータを受け取ることができ、言語ごとに何度も仕様を合わせたりする必要がなくなります。

    仕組みについての簡単な解説は以上で導入方法の解説に入っていきます。

    debug gemを導入

    Gemfileに以下を追加しインストールします

    1  gem "debug", ">= 1.0.0"

    ver1以上にしているのは、公式でver1未満は全く異なる製品と記述があるため最低ver1以上を入れた方が良さそうですね。

    vscode拡張機能「VSCode rdbg Ruby Debugger」を導入

    VSCode上で「rdbg」と検索し「VSCode rdbg Ruby Debugger」をインストールしましょう。

    ここでインストールしたgemと、この拡張機能の役割をご紹介します。
    以下のように拡張機能が「Debug Adapter」として仲介役を担い、アプリケーション内のdebug gemと通信をし、エディタとは「Debug Adapter Protocol」でやり取りをしてくれます。

    docker-compose.ymlにデバッグ用の設定を追加

    debug gemをインストールしただけではデバッグできません。
    docker-compose.ymlのRailsコンテナに以下の設定を追加しましょう。

    1command: bundle exec rdbg -n --open --host 0.0.0.0 --port 12345 -c -- bin/rails server -b 0.0.0.0
    1ports:
    2  - "12345:12345"

    上記の設定は以下のようなことをしています。

    • rdbgコマンドでデバッガーを立ち上げ12345ポートで待機させている
    • コンテナ内のデバッガーにアクセスするため12345に対してポートフォワードしている

    次にVSCodeでデバッグ実行するための設定ファイルを作成します。

    VSCodeデバッグ用の設定ファイルを作成

    こちらを参考にlaunch.jsonファイルを作成します。

    このファイルでVSCodeでどのようにデバッグをするかを設定します。

    以下の設定を添付してください。

    1{
    2  "version": "0.2.0",
    3  "configurations": [
    4    {
    5      "type": "rdbg",
    6      "name": "AttachLocal",
    7      "debugPort": "localhost:12345",
    8      "localfsMap": "/コンテナ内のパス:${workspaceFolder}",
    9      "request": "attach",
    10    }
    11  ]
    12}

    この設定で重要な箇所は以下になります

    • debugPort「localhost:12345」の設定
      • デバッグ実行時にdocker-compose.ymlで設定したポートフォワードに従ってコンテナ内で待機しているデバッガーにアクセスがいく。
      • デバッガーにアクセスがいったことでデバッガーが起動状態になる
    • localfsMap「/コンテナ内のパス:${workspaceFolder}」の設定
      • ローカルとコンテナのパスをマッピングしています。
      • ブレークポイントを設定しても、この設定がないと止まってくれません。
      • おそらくブレークポイントを設定した時VSCodeはローカルのファイルのパス情報しかわからないため、コンテナ内ではどのファイルの何行目を指しているのかわからないためマッピングが必要なのだと思います。

    サーバーを起動して実際にデバッグ

    サーバーを起動すると以下のようにログが出ます。
    デバッガーが12345ポートで待機してくれています。

    次に三角ボタンをクリックしデバッグを実行します。

    ログに「デバッガーと接続した」とでればOKです。

    準備はできたので処理を止めたい箇所にブレークポイントを設定します。

    次にブレークポイントまで処理がいくように私の環境ではindexアクションにアクセスします。

    処理が止まり変数も表示されていますね!
    デバッグ成功です!

    最後に

    今回は、docker環境でRailsをVSCodeからデバッグする方法をご紹介させていただきました。
    正直導入するのはかなり難しかったです。
    頑張って導入してみてもブレークポイントで止まらなかったり、エラー起きたり色々アクシデントがあるかと思います。
    その時、デバッグする仕組みを全然理解していないと、どうすればよいかわからず「???」状態になります。
    本記事がそんな方への参考になれば幸いです。(解説に使用したプロジェクトはGithubに上げています)

    はっと(エンジニア)

    はっと(エンジニア)

    おすすめ記事