Using Pry in Rails, when I hit a breakpoint in the code binding.pry
I want to know how I got here, who called me, who called them, etc. But oddly I don't see that command. Does anyone know?
Pry is a runtime developer console and IRB alternative with powerful introspection capabilities. Pry aims to be more than an IRB replacement. It is an attempt to bring REPL driven programming to the Ruby language.
To do this without any pry plugins (I was having troubles with pry-stack_explorer), just look at caller
.
I actually look for my project name to filter out all the irrelevant rails stack items. For example, if my project name were archie
I'd use:
caller.select {|line| line.include? "archie" }
Which gives me the stack trace I'm looking for.
A shorter way would be:
caller.select {|x| x["archie"] }
Which works just as well.
There is pry-backtrace which show's the backtrace for the Pry session.
There is also wtf?. Which show's the backtrace of the most recent exception. Add more question marks to view more of the backtrace or an exclamation mark to see it all.
Type help in pry to see all the other commands :)
Use the pry-stack_explorer plugin, it allows you to move up and down the call-stack (with up
and down
), display the callstack (with show-stack
), and so on:
see here:
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>)>
Extending on Paul Oliver's answer.
If you have a list of phrases you want to permanently exclude you can do that with a custom commands feature in Pry.
In ~/.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
Calling callerf
will result in a filtered caller
output. Weird signs around #{output}
is coloring to replicate the original look of the caller
. I took the color from here.
Alternatively, if you don't want to make a custom command, use Ctrl+R
to search through command history.
You can use caller method which already defined inside the gem library. The return value of that method will be an array. So you can event apply array methods for search in that bunch of lines
Below is also helpful for powerful trace. https://github.com/pry/pry-stack_explorer
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With