Pry: show me the stack

Ruby on-RailsPry

Ruby on-Rails Problem Overview


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?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

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.

Solution 2 - Ruby on-Rails

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

Solution 3 - Ruby on-Rails

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

Solution 4 - Ruby on-Rails

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.

Solution 5 - Ruby on-Rails

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpitosalasView Question on Stackoverflow
Solution 1 - Ruby on-RailsPaul OliverView Answer on Stackoverflow
Solution 2 - Ruby on-RailsgefView Answer on Stackoverflow
Solution 3 - Ruby on-RailshorseyguyView Answer on Stackoverflow
Solution 4 - Ruby on-RailssloneorzeszkiView Answer on Stackoverflow
Solution 5 - Ruby on-RailsNishant UpadhyayView Answer on Stackoverflow