LoginSignup
2
0

puma-devで動いているRailsアプリをRubyMineでデバッグする3つの方法と最適解

Posted at

前置き

RubyMine入門したての @rakudalms です。
定義ジャンプが強力過ぎてもうRubyMine無しでは開発したくないほどに惚れ込んでおりますw

さて本題ですがIntelliJ系IDEをお使いの皆さん puma-dev 環境でのデバッグどうしてますか?

色々な記事を参考にしたり先輩に聞いたりして3つの方法を検証しましたので共有させていただきます。

RubyMineでの検証しかしていませんが他のIntelliJ系IDEでも方法1と方法3は参考になると思いますたぶん。

対象読者

puma-dev のサーバー起動を自動起動設定(Railsアプリのシンボリックリンクを貼るやり方)にしているけどデバッグってどうやんの?て方。

環境

MacBook Pro 14インチ, 2021(M1)
mac OS 13.3.1 (Ventura)
RubyMine 2022.3.2

先に結論!

結論から言うと、余計な設定が全くいらない方法3が個人的には最適解なんじゃないかなと思ってます。
ただ個々人の環境によって違うとは思うのでそれぞれ試してみて1番しっくりくるものを選んで頂けたらと思います。

解説

ここからは各方法の解説をしていきます。

方法1. RubyMineの Attach to Processpuma-dev のプロセスに直接アタッチ

この方法や puma-dev に関しては @jnchito さんが超わかりやすい記事を公開してくれています。
(いつも分かりやすい記事感謝です🙏)

以下冒頭引用

RubyMine 2016.3から、ローカルで動いているRubyプロセスにアタッチしてデバッグ実行できる機能が追加されました。
これにより、PowやPuma-devで動いているRailsアプリに対してもRubyMineからアタッチしてデバッグ実行することができます。

とある通り Run > Attach to Process で起動中の puma-dev プロセスに直接アタッチできます。
CleanShot 2023-03-08 at 23.43.57 attach to process.jpg
ただ @jnchito さんも書いてるのですが、アタッチまでにクセがありうまく繋げないことも。

使いこなせる方はRubyMine標準となった機能ですしこれが1番良さそうな気がします。

私の場合は成功率が低かったので更に他の方法を検証していきます。

方法2. Railsアプリ上で自作Debuggerを起動させてRubymineの Ruby remote debug を実行

次に @rakuma_devrel さんの以下の記事を参考にして試してみた結果です。

正しいやり方・お作法かは置いておいて私のやった手順を紹介します。

1) デバッグ用のgemをインストール

@rakuma_devrel さんの記事ではgemをローカルインストールしてましたがとりあえず私はGemfileに記載

Gemfile
gem 'ruby-debug-ide'
gem 'debase-ruby_core_source'
gem 'debase'

その後 bundle install

terminal
$ bundle install

2) Rails起動で必ず実行されるRubyファイルにDebuggerコードを仕込む

私の場合は、 config/initializers 配下に remote_debugger.rb を作ってその中にコードを書きました。
Rails起動で必ず実行されるファイルであれば何でもOKです(極端な話、application_controller.rbとかに仕込むとかでも。一応試し済)

config/initializers/remote_debugger.rb
ruby_home = `which ruby`.strip.split('/')[0..-3].join('/')
debase_path = Dir[ruby_home + '/lib/ruby/gems/*/gems/debase-0*'][-1]
debug_ide_path = Dir[ruby_home + '/lib/ruby/gems/*/gems/ruby-debug-ide-0*'][-1]

$LOAD_PATH.push(debase_path + '/lib')
          .push(debug_ide_path + '/lib')

require 'ruby-debug-ide'

begin
  TCPSocket.new('127.0.0.1', 1235).close
rescue Errno::ECONNREFUSED => e
  Debugger.start_server nil, 1235
else
  p 'Debugger.start_server failed. port is already in use'
end

上記の 1235 がこのDebuggerのポート番号です。ユニークであれば任意の番号でOK。後ほど使います。

3) Rubymineで Ruby remote debug のConfigurationを作成

Run > Edit Configuration を開き、
CleanShot 2023-03-08 at 23.43.57.jpg

左上の + ボタン押下 > Ruby remote debug を選択
CleanShot 2023-03-08 at 23.44.48.jpg

下記のように設定
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3534323538312f61306432313438382d613130632d386666302d316466362d6237663266373063343362372e6a706567.jpg

4) puma-dev サーバーの再起動

terminal
$ puma-dev -stop

5) RubyMineremote debugger を起動

Rubymine の Run > Debug 'remote debugger'(3で作ったやつ)を実行
Debug Tool Window の VariablesConnected と表示されていたら接続成功です。

接続時のクセもなく成功率100%でデバッグ可能です。

ただ、gemをインストールする必要があったり、デバッグコードを仕込んだりする必要があるのが難点だと思います。

もう少し他の方法がないか社内MTGの後半で先輩エンジニアに質問。

これで下記の個人的最適解にたどり着きました。

方法3.  【個人的最適解】 puma-dev をプロキシモードで起動するようにする

この方法だと、方法2のようにファイルも汚さないし、 rails s でサーバー起動するだけで簡単にデバッグ出来るようになるのでかなり良さそう。

手順は以下の通り

1) puma-dev の設定をプロキシモードでの起動に変更する

terminal
# .puma-devディレクトリに移動
$ cd ~/.puma-dev

# シンボリックを解除
$ unlink MY_APP

# `rails s` のポート番号が書いてあるだけのファイルを作成
$ touch MY_APP; echo 3001 >> My_APP

MY_APP は自分のRailsアプリ名(リポジトリ名)に置き換えてください
3001 の部分は rails s 時のサーバーのポート番号なので自身の環境でお好みに

これで puma-dev のサーバー起動設定がプロキシモードになりました。

2) RubyMineで起動するサーバーのポート番号を変更

rails s のポートをデフォルト(3000)以外にしている場合はRubymine上のサーバーのポート設定も変更します

Run > Edit Configuration > Rails > rails server > Port:
CleanShot 2023-03-09 at 10.04.42.jpg
rails server は自身の環境により名前が違いますたぶん(Rubymine で最初にプロジェクトを開いたらデフォルトで作成される?やつです)

3) RubyMineでサーバー起動

後は Rubymine 上で Run > rails server を起動(ショートカット設定しとくと楽)

なんともうこれでデバッグできる状態になってます。
ブレークポイント貼って好きなだけデバッグしましょう!

すごくないですか?たったこれだけです!超簡単!!

まとめると

  • 接続のクセなし(100%繋がります)
  • プロジェクト上にファイルを増やす必要なし
  • 新たにgemをインストールする必要なし
  • RubyMine上に余計なConfigurationを作る必要なし

ようするに puma-dev を使ってない状態と全く同じようにデバッグ出来るのです!!!

以上の理由から今回のデバッグ方法模索の旅は終了、方法3を私の中での最適解とさせていただきます。

補足

本編であまり触れてなかった puma-dev のサーバー起動モードについての補足をしておきます。

puma-dev の起動モードには2種類あり、ブラウザでRailsアプリへのアクセス時に .puma-dev/ 配下にあるアプリ名を見に行っていてそれの中身がシンボリックリンクかポート番号が書いてあるかでモードを振り分けているようで、

  • シンボリックリンク → 自動で該当アプリの puma-dev が起動(rails s 不要)
  • ポート番号(プロキシモード) → 通常通り手動で rails s でのサーバー起動が必要
    という挙動の違いがあります。

今までプロキシモードでのサーバー起動って結局 rails s しなきゃだしなんでこれにする必要あるの?って思ってましたが、今回の検証をしたことで納得出来ました。

RubyMineにはRailsサーバーと一緒に起動させたいスクリプトをまとめる機能(Compound)があるので、そもそも自動で起動させずに自身でサーバーの起動をコントロールした方が良い点もあることも教わりました。

もちろんプロキシモードにすると puma-dev の利点である自動起動がしなくなるので、方法1で問題なく puma-dev サーバーにアタッチ出来る人は方法1がベストな気もしてます。

あとがき

長々書きましたが、ネット上にある情報をそれぞれ比較検証してみました。

一長一短ですが、サーバーが自動で起動しないのと引き換えにRubyMineでデバッグしやすくなるならそれは大きな利点だと思います。

色々勉強になりましたし、なによりRubyMineがより一層好きになりましたw

この記事によって皆様の開発の一助になれば幸いです🙇🏻

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0