こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。今日は、Rubyのpry-byebugについて解説したいと思います。pry-byebugというと、
- pry-byebugのインストール方法がよくわからない!
- pry-byebugのデバッグ用のコマンドはどう使えばいいの?
と疑問に思う方もたくさんいらっしゃると思います。そこで!今回は、
- pry-byebugのインストールについてまとめ
- pry-byebugのデバッグ用コマンドについてまとめ
の解説をしていきたいと思います。それでは、行って見ましょう!
Rubyのpry-byebugをインストールする方法
Mac/Linuxにpry-byebugをインストールする方法
pry-byebugをMacやLinuxにインストールするには、gemを使ってインストールします。
gem install pry-byebug
Winowsにpry-byebugをインストールする方法
pry-byebugをWindowsにインストールする場合は、最新版のRubyInstallerのrubyには、pry-byebugが対応していない場合があり、注意が必要です。
もし、pry-byebugをWindowsにインストールする際にエラーが発生した場合は、RubyInstallerのバージョンを下げて試してみてください。
なお、筆者のところでは、RubyInstaller v2.3.3 ではpry-byebugはインストールできず、RubyInstaller v2.0.0にしたら、pry-byebugがインストールできました。ただし、RubyInstaller v2.0.0 のSSL証明書が問題でruby自体のインストールができないため、以下に回避方法を載せています。
RubyInstallerのダウンロードとインストール:
UR+:http://www.rubylife.jp/install/install/index1.html
古いRubyInstallerのSSL証明書問題を回避する方法:
URL:http://qiita.com/shimoju/items/394818b4989b94680aaf
DevKitのインストール:
URL:http://www.rubylife.jp/railsinstall/rails/index4.html
後は、Windowsでも、gemで、
gem install pry-byebug
するだけです。
readlineが問題でpry-byebugがインストールできない場合
まれに、readlineがインストールされていないことが原因で、pry-byebugがインストールできない場合があります。その場合は、rb-readlineをpry-byebugより先にgemでインストールします。
URL:http://qiita.com/KanakoKobayashi/items/32bf91437bc1de1a779a
gem install rb-readline gem install pry-byebug
Rubyのpry-byebugでデバッグする方法
ブレークポイントをセットし、デバッグモードにする方法
pry-byebugを起動して、rubyのコードをデバッグモードにするには、コードの中に、「binding.pry」を記述しておきます。
require "pry" a = "apple" b = "bake" c = "cookie" binding.pry eats = a + b + c msg = "I eats " + eats + " today." p eats p msg
その後、上のスプリクトを実行すると、binding.pryのところで処理が止まって、pry-byebugが起動します。
From:01_ruby_pry.rb @ line 9 : 4: a = "apple" 5: b = "bake" 6: c = "cookie" 7: 8: binding.pry => 9: eats = a + b + c 10: msg = "I eats " + eats + " today." 11: p eats 12: p msg [1] pry(main)>
[1] pry(main)>
のところに、pry-byebugのデバッグ用コマンドを指定できます。
デバッグモード時にブレークポイントをセットする方法
デバッグモード時に、好きが行にブレークポイントをセットするには、以下のようにpry-byebugのコマンドプロンプトにコマンドを指定します。
[1] pry(main)> break 11
これで、行11にブレークポイントが設定され、以下のような表示になります。
Breakpoint 1: 01_ruby_pry.rb @ 11 (Enabled) 8: eats = a + b + c 9: msg = "I eats " + eats + " today." 10: p eats => 11: p msg
後は、continueコマンドを実行すれば、処理が進み、先ほど設定した行11で処理がとまります。
[2] pry(main)> continue "applebakecookie" Breakpoint 1. First hit From:01_ruby_pry.rb @ line 11 : 6: 7: binding.pry 8: eats = a + b + c 9: msg = "I eats " + eats + " today." 10: p eats => 11: p msg [2] pry(main)>
変数の中身を見る方法
デバッグモード時は、各種変数の値を確認できます。pry-byebugのコマンドプロンプトに変数名のみ書いてEnterすると、その変数の中身が表示されます。
From:01_ruby_pry.rb @ line 11 : 6: 7: binding.pry 8: eats = a + b + c 9: msg = "I eats " + eats + " today." 10: p eats => 11: p msg [11] pry(main)> eats => "applebakecookie" [12] pry(main)>
上の例では、eatsの中身、”applebakecookie”が表示されていますね。
ステップ実行する方法
ステップイン
デバッグモードで、1行ずつ実行していくことを、ステップ実行といいます。
その中で、ステップインとは、1行ずつ実行するけれども、間に関数があった場合、関数の中に入ってステップ実行を続けるというコマンドです。ステップインのpry-byebugコマンドは、「step」です。ここで例に示すサンプルコードは以下の通りです。
require "pry" def grouping(a,b,c) return a+b+c end a = "apple" b = "bake" c = "cookie" binding.pry eats = grouping(a,b,c) msg = "I eats " + eats + " today." p eats p msg
実際にpry-byebugでデバッグモードにしてステップインした状態は以下の通りです。
From:02_ruby_pry_step.rb @ line 12 : 7: a = "apple" 8: b = "bake" 9: c = "cookie" 10: 11: binding.pry => 12: eats = grouping(a,b,c) 13: msg = "I eats " + eats + " today." 14: p eats 15: p msg [1] pry(main)> step From:02_ruby_pry_step.rb @ line 4 Object#grouping: 3: def grouping(a,b,c) => 4: return a+b+c 5: end [1] pry(main)>
上の例のように、行12でstepコマンドを使うと、関数groupingの中に入って行きますね。
ステップオーバー
ステップオーバーとは、ステップインと異なり、間に関数があっても、その上を飛び越えて次の行に移るステップ実行のことです。ステップオーバーのpry-byebugのコマンドは、「next」です。
From: 02_ruby_pry_step.rb @ line 12 : 7: a = "apple" 8: b = "bake" 9: c = "cookie" 10: 11: binding.pry => 12: eats = grouping(a,b,c) 13: msg = "I eats " + eats + " today." 14: p eats 15: p msg [1] pry(main)> next From:02_ruby_pry_step.rb @ line 13 : 8: b = "bake" 9: c = "cookie" 10: 11: binding.pry 12: eats = grouping(a,b,c) => 13: msg = "I eats " + eats + " today." 14: p eats 15: p msg [1] pry(main)>
上の例のように、関数groupingをオーバーして、次の行13に進んでいますね。
ステップアウト
ステップアウトとは、ステップインして関数の中に入ってステップ実行している際に、関数の外に出たところまで、実行を移すコマンドのことです。ステップインする必要がなくなった際に、関数から素早く抜け出る際に使用します。
pry-byebugのステップアウトのコマンドは、「fininsh」です。
From:02_ruby_pry_step.rb @ line 4 Object#group ing: 3: def grouping(a,b,c) => 4: return a+b+c 5: end [1] pry(main)> finish From:02_ruby_pry_step.rb @ line 13 : 8: b = "bake" 9: c = "cookie" 10: 11: binding.pry 12: eats = grouping(a,b,c) => 13: msg = "I eats " + eats + " today." 14: p eats 15: p msg [1] pry(main)>
上の例では、関数groupingの中でfinishコマンドを使って、関数を抜け出ています。そして、行13のところで、実行が止まっています。
スタックフレームを移動する方法
ステップ実行と重なりますが、関数の呼び出し階層のことをスタックフレームと言います。関数呼び出しがあると必ず、1つのスタックフレームが積まれます。
pry-byebugでは、このスタックフレームを元に戻して上の階層に戻ったり(up)、下の階層に潜ったり(down)<、自由に移動できます。サンプルコードは以下の通りです。
require "pry" def grouping(a,b,c) t1 = add(a,b) t2 = add(t1,c) return t2 end def add(v1,v2) return v1+v2 end a = "apple" b = "bake" c = "cookie" binding.pry eats = grouping(a,b,c) msg = "I eats " + eats + " today." p eats p msg
pry-byebugを使って、スタックフレームを移動する様子は以下の通りです。
From:03_ruby_pry_stack.rb @ line 18 : 13: a = "apple" 14: b = "bake" 15: c = "cookie" 16: 17: binding.pry => 18: eats = grouping(a,b,c) 19: msg = "I eats " + eats + " today." 20: p eats 21: p msg [1] pry(main)> step From:03_ruby_pry_stack.rb @ line 4 Object#grouping: 3: def grouping(a,b,c) => 4: t1 = add(a,b) 5: t2 = add(t1,c) 6: return t2 7: end [1] pry(main)> step From:03_ruby_pry_stack.rb @ line 10 Object#add: 9: def add(v1,v2) => 10: return v1+v2 11: end [1] pry(main)> up From:03_ruby_pry_stack.rb @ line 4 Object#grouping: 3: def grouping(a,b,c) => 4: t1 = add(a,b) 5: t2 = add(t1,c) 6: return t2 7: end [1] pry(main)> down From:03_ruby_pry_stack.rb @ line 10 Object#add: 9: def add(v1,v2) => 10: return v1+v2 11: end [1] pry(main)>
上の例のように、upとdownで関数の呼び出し階層を移動できていますね。
まとめ
いかがでしたか。pry-byebugのインストールは、gemを使えば、比較的容易に行うことができましたね。pry-byebugは非常に使えるパッケージですので、これを機会に皆さんも導入を検討して頂ければ幸いです。
pry-byebugの解説では、デバッグモードに入るブレークポイントの設定方法、行を指定してのブレークポイントの設定方法、変数の中身を見る方法を解説してきました。
コードを動かしながら変数の中身を確認できればデバッグもスムーズに行きますね。ステップイン、ステップオーバー、ステップアウトなどのステップ実行コマンドも、デバッグでは必須になってくる重要なテクニックです。
また、関数の呼び出し階層(スタックフレーム)を自由に移動できるup、downコマンドもかなり便利です。移動した階層で変数の中身を表示すれば、どこでどの変数の値がおかしいのかわかり、デバッグも進みますね。
以上のように、pry-byebugはとてもデバッグに重宝するツールですので、ぜひ、ここで覚えられておいてください。pry-byebugのことを忘れてしまったら、またこのページをご覧になってください!