Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pry: show me the stack

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?

like image 911
pitosalas Avatar asked Mar 08 '13 20:03

pitosalas


People also ask

What is pry in rails?

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.


5 Answers

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.

like image 79
Paul Oliver Avatar answered Sep 30 '22 18:09

Paul Oliver


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

like image 34
gef Avatar answered Sep 30 '22 18:09

gef


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>)> 
like image 23
horseyguy Avatar answered Sep 30 '22 18:09

horseyguy


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.

like image 33
sloneorzeszki Avatar answered Sep 30 '22 19:09

sloneorzeszki


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

like image 22
Nishant Upadhyay Avatar answered Sep 30 '22 17:09

Nishant Upadhyay