0. はじめに
Ruby 3.1 がリリースされ半年が経ちましたが、なかなか深くまで触れていないので手を動かしながらリリース内容を要所で見て所感を綴ろうかなと思います。
今回は 新規のデバッガー debug gemです。
既存でもデバッガー自体はありましたがそれと比較してみようかと思います
1. リリースノートを見てみる
デバッグ時の速度低下を極力生じないよう改善
リモートデバッグのサポート
リッチなデバッガフロントエンドに対応(現在 VSCode と Chrome ブラウザに対応)
マルチプロセス、マルチスレッドプログラムのデバッグに対応
カラフルな REPL
そのほか、Record & Replay 機能やトレース機能など、様々な便利機能
...
Rubyにはこれまでも lib/debug.rb が同梱されていましたが、あまりメンテナンスされておらず、性能や機能に問題がありました。debug.gem はこれを完全に置き換えます。
引用: https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/
書かれていることはなんとなくわかりますが、実際にはどんなものだろうって言う感じでした。。。
2. 触ってみる
使い方を README を拝見しながら触ってみます
a = 1
b = 2
binding.break
c = 3
d = 4
binding.break
p [a, b, c, d]
$ ruby -r debug sample_1.rb
コマンド実行すると以下のようにブレイクポイントで止まりました
ちなみに比較として2系のrubyのデバッガーモードで実行すると以下のような感じでした(個人的には2系の標準デバッガーはお世辞にも使いづらく感じていて外部gemである pry を使っていたりしました)
こちらを動作確認した限りでの所感は以下の通りでした
1. カラフル
- デバック実行時のREPLがカラフルですね!中には黒白onlyが好みの人もいるかもしれませんが、私はこんな感じでカラフルなのは好きです
2. コマンドの内容を入力しながら確認できる
- 画像見ていただけるとわかると思いますが、コマンドを入力しているとエイリアス→実際のコマンドの内容がコマンド横に横で教えてくれます
- もちろん help(h) でコマンド一覧を見ることはできますが、ぼんやりこれで合っていたっけ? っていうものをコマンドを打ちながら確認できるのはありがたかったです (特にrubyでも色々なデバッガーのgemがあったり言語によっては微妙にコマンドに差異があったりするので助かります)
3. rdbg コマンドでコードを変更せずにデバッグ可能
- ブレイクポイントである
binding.break(binding.b)
を入れなくても rdgbコマンドでコード先頭でデバッガーが起動できます。短いコードやコードを汚したくない時などは便利かもしれないですね!
a = 1
b = 2
c = 3
d = 4
p [a, b, c, d]
$ rdbg sample_2.rb
- 他にも
rdbg
コマンドは rake etc... のコマンドオプションrdbg -c -- ...
とすることで ruby コマンド以外も実行時に使用できるらしいです。汎用性が高いのは良いですね!
その他
- こちらでは紹介しておりませんがリモートデバッグ機能があったりと面白い使い方ができるのは良いですね。
3. 最後に
今回は3.1で追加されたdebug機能を紹介しました。
新しいデバッガーは標準のものをそのまま使用しても良さそうと思えるものでした。
機会があればその他の機能も触ってみたいと思いました。
今回の動作確認する上で使用したコードは以下で公開しておきます!