Pry: mostre-me a pilha

101

Usando Pry no Rails, quando eu atingir um ponto de interrupção na ligação de código.

Quero saber como cheguei aqui, quem me ligou, quem os chamou, etc. Mas, estranhamente, não vejo esse comando. Alguém sabe?

pitosalas
fonte

Respostas:

51

Use o plug - in pry-stack_explorer , ele permite que você mova para cima e para baixo na pilha de chamadas (com upe down), exiba a pilha de chamadas (com show-stack) e assim por diante:

Veja aqui:

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>)> 
cara de cavalo
fonte
138

Para fazer isso sem nenhum plug-in pry (eu estava tendo problemas com pry-stack_explorer), basta olhar para caller.

Na verdade, procuro o nome do meu projeto para filtrar todos os itens irrelevantes da pilha do Rails. Por exemplo, se o nome do meu projeto fosse, archieeu usaria:

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

O que me dá o rastreamento de pilha que estou procurando.

Uma maneira mais curta seria:

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

O que funciona muito bem.

Paul Oliver
fonte
1
Isso é ótimo. Fiquei irritado porque incluía a pilha de chamadas do pry e eu só queria o que vinha especificamente de meu aplicativo. +1!
cdpalmer
6
Perfeito. Eu adicionei uma combinação de teclas ao tmux para inserir isso (vincular 'B' enviar teclas '... ^ M'), usando um "rejeitar" em vez disso, é mais genérico: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide
4
Fiel à comunidade Ruby, a única resposta útil está escondida sob o conselho de instalar alguns plug-ins.
Jesse Dhillon
4
esta resposta merece muitos votos positivos. Sim, você pode instalar mais coisas em cima do pry. Mas você também pode usar os recursos de linguagem existentes do Ruby para chegar quase tão longe (certamente o suficiente para responder à pergunta do OP!)
amenthes
1
Esta resposta deve ser a correta, pois não requer plug-ins adicionais!
Alvaro Cavalcanti
83

Há um rastreamento de retorno que mostra o rastreamento de retorno para a sessão do Pry.

Também há wtf? . Qual show é o backtrace da exceção mais recente. Adicione mais pontos de interrogação para ver mais do backtrace ou um ponto de exclamação para ver tudo.

Digite help in pry para ver todos os outros comandos :)

gef
fonte
1
pry-backtraceestá ok, mas o pry-stack_explorerplugin é muito mais poderoso (embora seja outra joia, um plugin)
horseyguy
7
mas o fato é que às vezes você não usa todos esses recursos :)
Dzung Nguyen
1

Você pode usar o método caller que já está definido dentro da biblioteca gem. O valor de retorno desse método será uma matriz. Então você pode aplicar métodos de array para pesquisa naquele monte de linhas

Abaixo também é útil para rastreamento poderoso. https://github.com/pry/pry-stack_explorer

Nishant Upadhyay
fonte
0

Ampliando a resposta de Paul Oliver.

Se você tiver uma lista de frases que deseja excluir permanentemente, pode fazer isso com um recurso de comandos personalizados no Pry.

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

A chamada callerfresultará em uma callersaída filtrada . Sinais estranhos ao redor #{output}são coloridos para replicar a aparência original do caller. Eu peguei a cor daqui .

Alternativamente, se você não quiser fazer um comando personalizado, use Ctrl+Rpara pesquisar no histórico de comandos.

Sloneorzeszki
fonte
Está na pasta de início ~/.pryrc. Se não, basta criá-lo. ~/sempre significa a pasta pessoal em sistemas Unix.
sloneorzeszki