gem install ruby-debug
デバッグをしたい場所で debugger メソッドをコールします。
class User < ActiveRecord::Base
def name
debugger # ← これ
puts "千早"
end
end
rails consoleを --debugger オプション付きで起動します。起動時にデバッガが有効になった旨のメッセージが出力されます。
script/console --debugger
=> Debugger enabled
※ 通常のRubyプログラムの場合はruby-debugをrequireして手動でデバッガを有効にすることができます。rails consoleと同じように --debuggerオプションを実装するとよいでしょう(consoleでもrequireしているだけです)。なおDebugger.startメソッドの引数で挙動を変える事もできるようです(未検証)。
require 'ruby-debug'
#Debugger.start # やらなくてもよい
デバッグポイントを通るコードを実行します。
>> User.first.name
デバッガが起動します。以降のコンテキストはデバッガになります。helpとtypeしてみましょう。
(rdb:1) help
ruby-debug help v0.10.4
Type 'help <command-name>' for help on a specific command
Available commands:
backtrace delete enable help method putl set trace
break disable eval info next quit show undisplay
catch display exit irb p reload source up
condition down finish kill pp restart step var
continue edit frame list ps save thread where
ヘルプが表示されました。ちなみに h だけでも同じ結果になります。
もっとも頻繁に使うのは eval コマンドでしょう。デバッグポイントのコンテキストで任意のRubyコードを実行することができます。
(rdb:1) eval self
#<User id:
continue コマンドで次のブレークポイントまで処理を実行します。なければ制御は console に戻ります。
(rdb:1) continue
=> "千早"
>>
代表的なコマンドを紹介します。
h[elp]
ヘルプ. h でコマンドのヘルプを表示.
s[tep]
1行づつ実行
n[ext]
処理を進める(次の行を実行する)
c[ontinue]
処理を進める(ブレークポイントで止まる)
b[reak]
ブレークポイントを設定する
backtrace
Backtraceを表示
irb
debuggerが実行している行のコンテキストでIRBを実行
l[ist]
ソースを表示する(list 入力ごとに、先に読み進める)
list= で現在行のソースを表示
list- で現在行の前を表示
v cl
クラス変数をすべて表示
var l
ローカル変数をすべて表示
var instance self
selfのインスタンス変数をすべて表示
詳細はコマンドのリファレンスを確認して下さい。
http://bashdb.sourceforge.net/ruby-debug.html#Debugger-Command-Reference
ユーザのホームディレクトリに .rdebugrc ファイルを作成すると ruby-debug実行時に読み込んでくれます。 下記のようなオプションが有用でしょう(#以降は削除して下さい)。
set autoeval # rdebugのコマンド以外は常にevalする
set autolist # 'next/step' のときに前後数行を表示
set autoreload # ソースの修正を都度読み込む
設定の一覧です。
http://bashdb.sourceforge.net/ruby-debug.html#ruby_002ddebug-settings
ruby-debug-completion と言うgemをインストールして読みこむようにすると ruby-debugインタプリタ内でコマンドや変数名などでTabキーによる自動補完が有効になります。素晴らしく便利なので導入をオススメします。