読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

ステップ実行可能なRailsリモートデバッグ環境

Ruby Rails IntelliJ IDEA RubyMine 環境構築 VirtualBox デバッグ

概要

IntelliJ IDEA 13 (または RubyMine) と rdebug-ide の組み合わせで
Ruby on RailsIDEデバッグ環境を構築する。

大事なこと

  • ブレークポイントを張れること
  • ステップ実行できること
  • コールスタックが参照できること
  • 変数内容が参照できること

作業環境の前提

Windows7MacOS なんかと置き換えても同じ手法が使えると思う。

リモート?

VirtualBox だしリモートでもなんでもないじゃん、って思うかもしれませんが、
デバッグ情報のやり取りをネットワーク越しでやってるので、れっきとしたリモートです。

SSHトンネル掘ったりすれば、今回の構成と同じようなものをVPS上に構築することもできるはずです。(やったことないけど)

ファイルシステム前提

Windows フォルダを VirtualBoxCentOS にマウントしておく。
手順:Windows7 のディレクトリを VirtualBox の CentOS にマウントする - clock-up-blog

f:id:kobake:20140128180557p:plain:w500

今回は、C:\sites (CentOS 上では /home/sites) をプロジェクト群の置き場とする。
例えば myproject というプロジェクトを管理する場合は、
C:\sites\myproject (CentOS 上では /home/sites/myproject) となる。

今回は「/media/sf_sites」がマウントポイントとなっています。
実はこのマウントポイントは後でとても大事な情報になります。

モジュール間の参照構成概要

デバッグ時のモジュール間の参照構成はこんな感じになる。

f:id:kobake:20140128181743p:plain:w600

構築手順

Windows側:hosts設定

作業便宜上です。

C:\Windows\System32\drivers\etc\hosts を編集

# 以下を追記 (IPはVirtualBox内CentOSを参照するIP)
192.168.XX.XX virtualbox

Rails側:必要なgemをインストールする

$ cd /home/sites/myproject
$ vi Gemfile
# 以下を追記
gem 'ruby-debug-ide'
gem 'debase'
$ bundle

IntelliJ IDEA側:デバッグ設定追加

[Run] - [Edit Configurations...] メニューを押して、「Run/Debug Configuration」ダイアログを表示する。
f:id:kobake:20140128183428p:plain:w400

「Run/Debug Configuration」にて、左上の「+」ボタンを押し、「Ruby remote debug」を選択する。
f:id:kobake:20140128185317p:plain:w600

デバッグ用の構成が増える。以下のような感じに情報を入力し保存。
f:id:kobake:20140128190734p:plain:w600

  • Name: 好きにつける
  • Remote host: virtualbox (さっき hosts 設定したのでこれでイケる)
  • Remote port: 1234
  • Remote root folder: /media/sf_sites/myproject
  • Local port: 26162
  • Local root folder: C:\sites\myproject

※Remote root folder のところ、けっこうキモです。
 シンボリックリンクのディレクトリだと何故かうまく動かないので、
 マウントポイントを直接参照するようなディレクトリを指定します。
 つまり、 /home/sites/myproject ではなく /media/sf_sites/myproject を入力します。

Rails側:デバッグ用待ち受け実行

$ cd /home/sites/myproject
$ bundle exec rdebug-ide --port 1234 --dispatcher-port 26162 --host 0.0.0.0 script/rails s
Fast Debugger (ruby-debug-ide 0.4.22, debase 0.0.9) listens on 0.0.0.0:1234

ポート1234で待ち受け状態になりました。

IntelliJ IDEA側:デバッガに繋ぐ

さっき追加したデバッグ設定を選択した上で、虫マークのアイコンからデバッガ接続する。
f:id:kobake:20140128195158p:plain:w500

「Debug」ビューの中で「Connected」という表示が確認できれば成功。
f:id:kobake:20140128192808p:plain:w500

Rails側:ターミナル確認

IntelliJ IDEA が接続されたことにより、ポート3000 (Web) の待ち受けに進んでいる。

$ bundle exec rdebug-ide --port 1234 --dispatcher-port 26162 --host 0.0.0.0 script/rails s
Fast Debugger (ruby-debug-ide 0.4.22, debase 0.0.9) listens on 0.0.0.0:1234
=> Booting Thin
=> Rails 3.2.16 application starting in kobake_mysql on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 0.0.0.0:3000, CTRL+C to stop

IntelliJ IDEA側:ブレークポイント設定

ソースコードの左側をクリックしてブレークポイント設定。
f:id:kobake:20140128194730p:plain:w400

ブラウザ側:サイトアクセス

http://virtualbox:3000/ にアクセス。

IntelliJ IDEA側:ブレーク確認、ステップ実行

ブレークポイントを設定した行に実行が到達すると、一時実行停止状態になりステップ実行可能となります。
f:id:kobake:20140128194736p:plain:w600
その時点でのコールスタックや変数の内容などを閲覧することもできます。

総括

端的に言うとシンボリックリンクの罠にすごくハマりました。
モジュールの修正完了を願います。

});