プログラムにバグはつきもので、バグを解消するためにはデバッグ作業が必要となります。
RubyではインタラクティブにデバッグするためのさまざまなGemが利用可能ですが、これらのGemを使わず標準機能だけでデバッグする方法を知っていると便利です。
Ruby on Railsの開発者Andres Chacon氏は、そんなRuby開発者向けのTipsを紹介する記事「Interactive debugging without the need to install gems(gemsをインストールする必要のないインタラクティブなデバッグ)」を公開しています。
この記事によると、Rubyスクリプトをデバッグする場合、バインディングを使うという選択肢があるそうです。バインディングはある時点での実行コンテキストをカプセル化したもので、Kernel#binding
で作成し、インスタンスメソッドirbを使ってコンソールを呼び出すことができます。
例えば以下のような内容のdoor.rb
を作成し、ruby door.rb
で実行します。
$ ruby door.rb
From: door.rb @ line 5 :
1: # door.rb
2: class Door
3: def initialize
4: @open = false
=> 5: binding.irb
6: puts "Is the door open: #{@open}"
7: end
8: end
9:
10: Door.new
irb(#<Door:0x0000000101d96a00>):001:0> @open
=> false
irb(#<Door:0x0000000101d96a00>):002:0> @open=true
=> true
irb(#<Door:0x0000000101d96a00>):003:0> exit
Is the door open: true
Doorクラスのイニシャライザの途中にあるbinding.irb
を呼び出した箇所でirbが起動し、インスタンス変数@open
の値を確認し(その時点ではfalse)、値をtrueに変更した後、実行を継続できることがわかります。
また、debug gemがインストールされていれば、IRBセッションでdebugと入力するだけで有効にすることができ、より便利なデバッガーの機能を利用することができます。IRBに関する情報はこちらから、debug統合機能に関してはこちらから確認可能です。