Ruby の debug-gem をつかってみた

RubyKaigi で発表があった debug-gem を使ってみたので覚書。
思ったよりもいろんな機能があった。

インストール

$ gem install debug

でインストールするか Gemfile に以下を追加して debug-gem を導入します。

gem "debug", ">= 1.0.0"

最新版を使いたい場合はこう。

gem "debug", git: "git@github.com:ruby/debug.git", branch: "master"

簡単な使い方

いくつか使い方はあるが今回は binding.break を使ってデバッグしてみる。

コード

  • 処理を止めたい場所に binding.break を仕込んでおく
    • ここで処理が止まる
require 'debug'

a = 1
b = 2
# binding.irb のように binding.break で処理が止まる
binding.break
c = 3
d = 4
binding.break
p [a, b, c, d]

デバッグ実行

  • 通常通り ruby コマンドでコードを実行すれば OK
  • binding.break したところで処理が止まる
$ bundle exec ruby sample.rb
[1, 9] in sample.rb
     1| require 'debug'
     2|
     3| a = 1
     4| b = 2
= >   5| binding.break
     6| c = 3
     7| d = 4
     8| binding.break
     9| p [a, b, c, d]
= >#0   <main> at sample.rb:5
  • ここで info locals を入力して確定するとローカル変数一覧が表示されたりする
$ bundle exec ruby sample.rb 
[1, 9] in sample.rb
     1| require 'debug'
     2| 
     3| a = 1
     4| b = 2
= >   5| binding.break
     6| c = 3
     7| d = 4
     8| binding.break
     9| p [a, b, c, d]
= >#0   <main> at sample.rb:5
(rdbg) info locals    # command
%self = main
a = 1
b = 2
c = nil
d = nil
(rdbg) 
  • 他にも nextstep でステップ実行したり p {Ruby の式} で式の実行結果を表示したりいろいろな機能がある
  • 詳しくは README を参照

所感

  • binding.irb みたいに binding.break で処理を止めてデバッグするのでとっつきやすいっちゃとっつきやすい
  • 対話時にコマンドを入力すると右側にコメントで注釈が出てくるのが便利
  • debug-gem 便利そう!と思いつつ byebug も使いこなせてないので debug-gem 使いこなせるかどうか…
  • プロセスへのアタッチはまだ試してないので試しておきたい
    • 既存の Rails へのプロセスへアタッチして中身をデバッグしてみたりとかしたいなあ…
  • RubyKaigi の登壇だとあんまり VSCode との連携の話が出てなかったのでこのあたりが気になる
    • DAP をサポートしているみたいなので VimDAP プラグインといい感じに接続できないかなあ…
  • Ruby 3.1 がいろいろと楽しみになってきた
  • 次は step back の記事を書くぞ…