RubyMine 2021.3.3 にて、 debug gemを含むRails 6.1 アプリがデバッグできなかったため、回避策を実施してみた

自分の環境だけかもしれませんが、RubyMine 2021.3.3で debug gem を含む Rails 6.1 アプリがデバッグできなかったため、回避策を実施したときのメモを残します。

 
目次

 

環境

手元の環境は以下ですが、もしかしたら他の環境も同様かもしれません。

 

再現の流れ

Railsとdebug gem の準備

rails new します。

なお、手元ではシステムのRubyRailsを入れず、bundlerで用意したRailsを使って行っています。

% bundle exec rails new rails_debug_6_1 --minimal --skip-bundle

 
RubyMineにて、同一Rubyでプロジェクトごとにgemを管理したいため、rbenv-gemsets を使います。

 
rbenv-gemsetsの準備をします。

# ディレクトリ移動
% cd rails_debug_6_1

# gemsetsを用意
% echo 'rails_debug_6_1' > .rbenv-gemsets

 
この状態で、RubyMineでプロジェクトを開きます。 Run/Debug Configurations を確認します。

Ruby SDKUse project SDK が選択され、 rails_debug_6_1 が入っていることを確認します。

また、Ruby SDKのエラーとして

Run Configuration Error: [No Rails found in SDK]

が出てることを確認します。

 
次に、 .rbenv-gemsets ファイルを開き、gemset名にカーソルを合わせ Create 'rails_debug_6_1' を選択し、gemsetsに追加します。
https://www.jetbrains.com/help/ruby/2022.1/ruby-gemsets.html#create_rbenv_gemset

rbenv-gemsets の準備ができたため、いったんRubyMineを閉じた後、再度開きます。

 
メニューから Preference > Languages & Frameworks > Ruby SDK and Gems を開き、作成したgemsetsが表示されていることを確認します。

gemsetsを有効にするため、チェックボックスにチェックを入れます。

 
 
次に Gemfile を開き、 byebug の代わりに debug を記載します。

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  # gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'debug', platforms: [:mri, :mingw, :x64_mingw]
end

 
bundle install し、必要なgemをインストールします。

インストール後、Ruby SDKにインストール済のgemが表示されることを確認します。

 

Railsアプリの作成

bin/rails g controller foods index でコントローラ・ビュー・ルーティングを生成します。

 
生成したコントローラ (app/controllers/foods_controller.rb) を開き、デバッグ用のコードを入れます。

この a = 1 の部分にブレークポイントを置きます。

class FoodsController < ApplicationController
  def index
    a = 1
  end
end

 
以上で準備ができました。

 

通常起動で動作確認

RubyMineの Run Development... をクリックし、Railsを起動します。

http://localhost:3000/foods/index にアクセスすると、ブラウザにビューの内容が表示されます。

 

デバッグ起動で動作確認

次に、RubyMineの Debug Development をクリックし、Railsデバッグ起動します。

すると、RubyMine Debugerのポップアップが出ます。

The debugging gems are not installed. Would you like to install them?

と表示されるため、 Yes をクリックすると、

  • debase 2.3.2
  • ruby-debug-ide 2.3.3

がインストールされます。

 
その後、デバッグ起動すると、以下が表示されます。

Fast Debugger (ruby-debug-ide 2.3.3, debase 2.3.2, file filtering is supported, block breakpoints supported, smart steps supported, obtaining return values supported, partial obtaining of instance variables supported) listens on 0.0.0.0:60376 ... * Listening on http://0.0.0.0:3000

その状態で http://localhost:3000/foods/index にアクセスしたところ、ブレークポイントでは止まらずに sleep した状態で動作が停止してしまい、デバッグができない状態になっています。

 

debugの代わりにbyebugを使う

一方、debugの代わりにbyebugをインストールするよう Gemfile に記載し、 bundle install 後にデバッグ起動すると、ブレークポイントで止まります。

gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
# gem 'debug', platforms: [:mri, :mingw, :x64_mingw]

 

 

原因など

youtrackを見るとそれっぽいものはいくつかありました。そのため、このあたりは今後改善されるかもしれません。

 

回避策

Gemfileから debug を削除すれば良いかもしれませんが、RubyMine以外で開発する場合に困るかもしれません。

そこで今回は

とします。

まずは USE_RUBYMINE 環境変数を設定します。

vi .zshrc 

 
.zshrc の末尾に追加します。

export USE_RUBYMINE=1

 
.zshrc を再読込し、環境変数が有効になっていることを確認します。

% source .zshrc
% echo $USE_RUBYMINE
1

 
Gemfileを修正します。

group :development, :test do
  # install_ifを追加
  gem 'debug', platforms: [:mri, :mingw, :x64_mingw], install_if: ENV['USE_RUBYMINE'].nil?
end

 
gem類をインストールし直します。

今回は rbenv-gemsets を使っているため、

  • rbenv-gemsets を削除 & 作成
  • bundle install とします。

 
まずは rbenv-gemsets を削除します。今回は Ruby 2.7.6 で作っているため、以下のように指定します。
https://github.com/jf/rbenv-gemset#usage

% rbenv gemset delete 2.7.6 rails_debug_6_1

 
次に、 .rbenv-gemsets ファイルを開き、Create rails_debug_6_1 します。

 
RubyMineを再起動して、gemsetsが空になっていることを確認します。

 
bundle install を行います。

その後 debug がインストールされていないことを確認します。

 
この状態でデバッグ起動し、ブレークポイントで停止することを確認します。

 

その他

RubyMineをデバッグ起動したときに

ruby-debug-ide 2.3.3, debase 2.3.2

と表示されました。

ただ、RubyGemsを見ると、それぞれのgemのバージョンは

でした。

この差はどこにあるのだろうと思ったら、stackoverflowにコメントがありました。

debase 2.3.2 is a proprietary backend bundled with Ruby plugin or RubyMine. You may use opensource gem from rubygems by disabling 'use experimental debugger' setting. – Olivia May 20, 2021 at 10:01

ruby - RubyMine debug gem versions different from public gem versions - Stack Overflow

 

ソースコード

再現用のアプリをGithubに上げました。 main ブランチで再現します。
https://github.com/thinkAmi-sandbox/rails_debug_6_1-sample

 
debug の代わりに byebug としたブランチはこちら。 https://github.com/thinkAmi-sandbox/rails_debug_6_1-sample/tree/feature/replace_from_debug_to_byebug

 
Gemfileに回避策を設定したブランチとGemfileはそれぞれこちら。