Skip to content

Instantly share code, notes, and snippets.

@tkyowa
Last active May 23, 2017 08:15
Show Gist options
  • Save tkyowa/1378694 to your computer and use it in GitHub Desktop.
Save tkyowa/1378694 to your computer and use it in GitHub Desktop.
ruby-debugを使ったRuby・Railsアプリケーションのデバッグ方法

ruby-debugを使ったRuby・Railsアプリケーションのデバッグ方法

インストール

# Ruby 1.8系の場合
gem install ruby-debug

# Ruby 1.9系の場合
gem install debugger

bundlerの場合は

gem "ruby-debug"

Gemfileに追記して bundle install します。

チュートリアル

デバッガを起動する

デバッグしたい場所で debugger メソッドをコールします。

class User
  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

デバッガが起動します。以降のコンテキストはデバッガになります。

(rdb:1) 

デバッグしてみる

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 は help のショートネームになっています。 eval コマンドでデバッグポイントのコンテキストで任意のRubyコードを実行することができます。

(rdb:1) eval self
#<User id: 

c[ontinue] コマンドで次のブレークポイントまで処理を実行します。 なければ制御は console に戻ります。

(rdb:1) continue
=> "千早"
>>

q[uit](exit)コマンドでアタッチしているRubyのプロセスごと終了できます。 確認ダイアログを飛ばしたい場合は q! で。

(rdb:1) q!
[tkyowa@host] $

コマンド紹介

代表的なコマンドを紹介します。

h - help <command>

<command>のヘルプを表示します。 コマンドはフルネームで入力する必要があります(h c などは不可)

デバッガ操作

s - step

処理を進めます(ステップイン)。


n - next

処理を進めます(ステップアウト)。


c - continue

処理を進めます(ブレークポイントで止まる)。


b - break <file:line> 

ブレークポイントを設定します。 引数がない場合はブレークポイントのリストを表示します。


del - delete <num>

指定した番号のブレークポイントを削除します。 引数がない場合はすべてのブレークポイントを削除します。


disp - display <expression>

特定の式をコマンドの実行毎に評価し、表示します。 引数なしの場合は設定しているdisplayのリストが表示されます。


undisp - undisplay <num>

指定した番号のdisplayを削除します。 引数がない場合はすべてのdisplayを削除します。


irb

debuggerが実行している行のコンテキストでIRBを実行します。

内部情報参照

l - list <-|=|nn-mm>

ソースを表示します。 引数なしの場合は現在行から以降の行を表示します。 list= で現在行のソースを表示します。 list- で現在行から前の行を表示します。


bt - backtrace(where)

バックトレースを表示します。


v[ar] cl[ass]

クラス変数をすべて表示します。


v l[ocal]

ローカル変数をすべて表示します。


v instance self

selfのインスタンス変数をすべて表示します。


info v

selfのローカル変数とインスタンス変数をすべて表示します。


詳細はコマンドのリファレンスを確認して下さい。
http://bashdb.sourceforge.net/ruby-debug.html#Debugger-Command-Reference

活用例

執筆予定

ruby-debugの設定ファイル

ユーザのホームディレクトリに .rdebugrc ファイルを作成すると ruby-debug実行時に読み込んでくれます。 下記のようなオプションが有用でしょう(#以降は削除して下さい)。

set autoeval    # rdebugのコマンド以外は常にevalする
set autolist    # 'next/step' のときに前後数行を表示 
set autoreload  # ソースの修正を都度読み込む

設定の一覧です。
http://bashdb.sourceforge.net/ruby-debug.html#ruby_002ddebug-settings

TIPS

ruby-debug-completion

ruby-debug-completion と言うgemをインストールして読みこむようにすると ruby-debugインタプリタ内でコマンドや変数名などでTabキーによる自動補完が有効になります。素晴らしく便利なので導入をオススメします。

https://github.com/cldwalker/ruby-debug-completion

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment