ぴよログ

↓に移転したのでこっちは更新されません、多分。

Pry便利だけどスタックトレース見られない、を解決

移転しました →

Pryまじ便利。

Pryが真の力を発揮してくれる19個のコマンドとコマンドの自作方法[Rails] - 酒と泪とRubyとRailsとPryが真の力を発揮してくれる19個のコマンドとコマンドの自作方法[Rails] - 酒と泪とRubyとRailsとはてなブックマーク - Pryが真の力を発揮してくれる19個のコマンドとコマンドの自作方法[Rails] - 酒と泪とRubyとRailsと

ちなみにPryにはこういう意味があったらしい。知りませんでした。ロゴを見る限りてこをイメージしているらしい。

英辞郎 on the WEBより

pry
【1名】
のぞき見、詮索
詮索好きな人
【1自動】
のぞき込む、詮索する、首を突っ込む、ほじくる
【2名】
てこ、てこ作用(で動かす道具)、てこを応用した道具【2他動】
~をてこで動かす、てこで上げる、苦労して引き出す

デバッグdebuggerよりもpry-debugger使っています。pry-debuggerpryにステップ実行などの機能を追加するgemです。ブレークしたいところにbinding.pryと書いておくと、そのときのスコープでPryが起動します。

binding.pryとは

ちょっと脱線。

bindingというのはKernelモジュールのbindingメソッドで、Bindingクラスのオブジェクトを返します。Bindingオブジェクトは

ローカル変数のテーブルとself、モジュールのネストなどの情報を保持するオブジェクトのクラスです。

というものです。

また、binding.prypryの部分は、pryという名前のメソッドで、Objectクラスに定義されています。

# pry-0.9.12.6/lib/pry/core_extensions.rb より
class Object
  def pry(object=nil, hash={})
    if object.nil? || Hash === object
      Pry.start(self, object || {})
    else
      Pry.start(object, hash)
    end
  end
end

binding.pryの場合、引数のないpryメソッド呼び出しなので、Pry.startにself(つまりbinding)を渡してPryを起動するということになるわけですね〜。

pry-stack_explorer

本題に戻ります。

Pryは超便利だけど、単体ではデバッガとしての機能やスタックを追う機能はあります。デバッガの機能はpry-debuggerで使えるようになりました。

スタックトレースを見たい場合はpry-stack_explorerというgemを導入する必要があります。それにしてもアンダースコアとダッシュを混ぜた名前を付けるなんて、、、!

pry/pry-stack_explorer

pry-stack-explorerをrequireした状態でbinding.pryによりPryを起動したとき、次のコマンドが使えるようになります。

  • down Go down to the callee's context.
  • frame Switch to a particular frame.
  • show-stack Show all frames
  • up Go up to the caller's context.

show-stackでスタックトレースがわかるし、up/downでコンテキストの移動ができたりします。Pryという強力な環境でスタックトレースまでできるので、ライブラリの挙動を調べたりデバッグするのによさそう。