Pry: muéstrame la pila


101

Usando Pry in Rails, cuando llego a un punto de interrupción en el enlace de código.

Quiero saber cómo llegué aquí, quién me llamó, quién los llamó, etc. Pero, curiosamente, no veo ese comando. ¿Alguien sabe?

Respuestas:


51

Use el complemento pry-stack_explorer , le permite moverse hacia arriba y hacia abajo en la pila de llamadas (con upy down), mostrar la pila de llamadas (con show-stack), y así sucesivamente:

mira aquí:

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

Para hacer esto sin ningún complemento de palanca (estaba teniendo problemas con pry-stack_explorer), solo mire caller.

De hecho, busco el nombre de mi proyecto para filtrar todos los elementos de pila de rieles irrelevantes. Por ejemplo, si el nombre de mi proyecto fuera archie, usaría:

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

Lo que me da el rastro de pila que estoy buscando.

Una forma más corta sería:

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

Que funciona igual de bien.


1
Esto es genial. Estaba molesto porque incluía la pila de llamadas de palanca y solo quería lo que provenía específicamente de mi aplicación. +1!
cdpalmer

6
Perfecto. Agregué una combinación de teclas a tmux para ingresar esto (enlazar 'B' send-keys '... ^ M'), usando un "rechazar" en su lugar para que sea más genérico: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Fiel a la forma de la comunidad Ruby, la única respuesta útil está enterrada debajo de los consejos para instalar algunos complementos.
Jesse Dhillon

4
esta respuesta merece tantos votos a favor. Sí, se puede instalar más cosas en la parte superior de la palanca. Pero también puede usar las funciones de lenguaje existentes de ruby ​​para llegar casi tan lejos (¡ciertamente lo suficientemente lejos como para responder la pregunta del OP!)
amenthes

1
¡Esta respuesta debería ser la correcta ya que no requiere complementos adicionales!
Alvaro Cavalcanti

83

Hay rastro de palanca que muestra el rastro de retroceso de la sesión de palanca .

También hay wtf? . Cuál programa es el rastro de la excepción más reciente. Agregue más signos de interrogación para ver más del retroceso o un signo de exclamación para verlo todo.

Escriba ayuda en palanca para ver todos los demás comandos :)


1
pry-backtraceestá bien, pero el pry-stack_explorercomplemento es mucho más poderoso (aunque es otra joya, un complemento)
horseyguy

7
pero el hecho es que a veces no usas todas esas funciones :)
Dzung Nguyen

1

Puede usar el método de llamada que ya está definido dentro de la biblioteca de gemas. El valor de retorno de ese método será una matriz. Entonces puede aplicar métodos de matriz para buscar en ese grupo de líneas

A continuación, también es útil para un seguimiento poderoso. https://github.com/pry/pry-stack_explorer


0

Ampliando la respuesta de Paul Oliver.

Si tiene una lista de frases que desea excluir permanentemente, puede hacerlo con una función de comandos personalizados en Pry.

En ~/.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

Llamar callerfdará como resultado una callersalida filtrada . Los signos extraños alrededor #{output}están coloreando para replicar el aspecto original del caller. Tomé el color de aquí .

Alternativamente, si no desea crear un comando personalizado, utilice Ctrl+Rpara buscar en el historial de comandos.


Está en la carpeta de inicio ~/.pryrc. Si no es así, simplemente créelo. ~/siempre significa la carpeta de inicio en los sistemas Unix.
sloneorzeszki
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.