自分の環境だけかもしれませんが、RubyMine 2021.3.3で debug
gem を含む Rails 6.1 アプリがデバッグできなかったため、回避策を実施したときのメモを残します。
目次
環境
手元の環境は以下ですが、もしかしたら他の環境も同様かもしれません。
- mac
- Ruby 2.7.6
- Rails 6.1.5
- debug gem 1.5.0
- RubyMine 2021.3.3
- 現時点では
2022.1
がリリースされているものの、Railways
ブラグインがうまく動作しないため、アップグレードを見送っています
- 現時点では
再現の流れ
Railsとdebug gem の準備
rails new します。
なお、手元ではシステムのRubyにRailsを入れず、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 SDKで Use project SDK
が選択され、 rails_debug_6_1
が入っていることを確認します。
が出てることを確認します。
次に、 .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
をクリックすると、
がインストールされます。
その後、デバッグ起動すると、以下が表示されます。
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を見るとそれっぽいものはいくつかありました。そのため、このあたりは今後改善されるかもしれません。
- debugger is broken : RUBY-29205
- Debugger stops only on 1st breakpoint and ignores all subsequent ones : RUBY-29456
回避策
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をデバッグ起動したときに
と表示されました。
ただ、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はそれぞれこちら。