てこ:スタックを見せて


101

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

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

回答:


51

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>)> 

138

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

実際には、プロジェクト名を探して、関係のないすべてのRailsスタック項目をフィルターで除外します。たとえば、私のプロジェクト名をarchie使用した場合:

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

これにより、探しているスタックトレースがわかります。

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

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

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


1
これは素晴らしい。呼び出しコールスタックが含まれていて、自分のアプリケーションから具体的に何が発生するのかを知りたくてイライラしました。+1!
cdpalmer 2015

5
完璧です。私の代わりにそれはより一般的だ『拒否』を使用して、この(バインド「B」センドキーの... ^ M ')を入力するようにtmuxのために、キーのコンボを追加しました: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Rubyコミュニティーにぴったりのフォームであり、いくつかのプラグインをインストールするというアドバイスの下には、唯一の有用な答えが潜んでいます。
Jesse Dhillon、2016年

4
この答えは非常に多くの賛成票に値します。はい、あなたはこじりの上により多くのものをインストールすることができます。しかし、あなたはまた、Rubyの既存の言語はほとんど限り取得する機能を使用でき(OPの質問に答えるために、確かに十分!)
amenthes

1
追加のプラグインを必要としないため、この答えは正しいはずです!
Alvaro Cavalcanti、

83

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

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

他のすべてのコマンドを表示するには、pryにhelpと入力してください:)


1
pry-backtrace大丈夫ですが、pry-stack_explorerプラグインの方がはるかに強力です(別の宝石、プラグインですが)
horseyguy

7
しかし、実際には、これらの機能をすべて使用しない場合があります:)
Dzung Nguyen 14

1

gemライブラリ内で既に定義されている呼び出し元メソッドを使用できます。そのメソッドの戻り値は配列になります。だからあなたはその行の束で検索のために配列メソッドを適用するイベントをすることができます

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


0

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

完全に除外したいフレーズのリストがある場合は、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こちらから色を取りました。

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


ホームフォルダにあります~/.pryrc。そうでない場合は、作成してください。~/Unixシステムでは常にホームフォルダを意味します。
sloneorzeszki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.