web-dev-qa-db-ja.com

こじ開け:スタックを見せて

RailsでPryを使用して、コードbinding.pryでブレークポイントに到達したとき

どうやってここに来たのか、誰が電話をかけたのか、誰が電話をかけたのかなどを知りたいのですが、奇妙なことに、そのコマンドが表示されません。誰か知っている?

85
pitosalas

pry-stack_Explorer プラグインを使用すると、コールスタックを上下に移動でき(upおよびdownを使用)、コールスタックを表示できます(_show-stack_)など:

こちらをご覧ください:

_Frame number: 0/64

From: /Users/johnmair/Ruby/Rails_projects/personal_site/app/controllers/posts_controller.rb @ line 7 PostsController#index:

    5: def index
    6:   @posts = Post.all
 => 7:   binding.pry
    8: end

[1] pry(#<PostsController>)> show-stack

Showing all accessible frames in stack (65 in total):
--
=> #0  index <PostsController#index()>
   #1 [method]  send_action <ActionController::ImplicitRender#send_action(method, *args)>
   #2 [method]  process_action <AbstractController::Base#process_action(method_name, *args)>
   #3 [method]  process_action <ActionController::Rendering#process_action(*arg1)>
<... clipped ...>

[2] pry(#<PostsController>)> up

Frame number: 1/64
Frame type: method

From: /Users/johnmair/.rvm/gems/Ruby-2.0.0-p0/gems/actionpack-3.2.8/lib/action_controller/metal/implicit_render.rb @ line 4 ActionController::ImplicitRender#send_action:

    3: def send_action(method, *args)
 => 4:   ret = super
    5:   default_render unless response_body
    6:   ret
    7: end

[3] pry(#<PostsController>)> 
_
46
horseyguy

Pryプラグインなしでこれを行うには(pry-stack_Explorerで問題が発生していました)、 caller を見てください。

実際にプロジェクト名を探して、関係のないすべてのRails=スタック項目を除外します。たとえば、プロジェクト名がarchieの場合、次のように使用します。

caller.select {|line| line.include? "archie" }

これは私が探しているスタックトレースを提供します。

より短い方法は次のとおりです。

caller.select {|x| x["archie"] }

これも同様に機能します。

110
Paul Oliver

Pryセッションのバックトレースを示す pry-backtrace があります。

wtf? もあります。これは、最新の例外のバックトレースです。より多くのバックトレースを表示するには疑問符を追加し、すべてを表示するには感嘆符を追加します。

Pryで help と入力して、他のすべてのコマンドを表示します:)

80
gef

Gemライブラリ内で既に定義されている呼び出し元メソッドを使用できます。そのメソッドの戻り値は配列になります。そのため、その一連の行で検索用の配列メソッドを適用できます

以下も強力なトレースに役立ちます。 https://github.com/pry/pry-stack_Explorer

1

ポールオリバーの答えを拡張します。

永久に除外したいフレーズのリストがある場合は、Pryのカスタムコマンド機能を使用してそれを行うことができます。

~/.pryrc

Pry::Commands.block_command "callerf", "Filter the caller backtrace" do
  output = caller.reject! { |line| line["minitest"] || line["pry"] } 
  puts "\e[31m#{output.join("\n")}\e[0m"
end

callerfを呼び出すと、フィルタリングされたcaller出力が生成されます。 #{output}は、callerの元の外観を再現するための色付けです。 here から色を取りました。

または、カスタムコマンドを作成したくない場合は、Ctrl+Rコマンド履歴を検索します。

0
sloneorzeszki