Прай: покажи мне стопку

101

Используя Pry in Rails, когда я нажимаю точку останова в коде binding.pry

Я хочу знать, как я сюда попал, кто мне звонил, кто им звонил и т.д. Но, как ни странно, я не вижу этой команды. Кто-нибудь знает?

питосалас
источник

Ответы:

51

Используйте плагин pry-stack_explorer , он позволяет перемещаться вверх и вниз по стеку вызовов (с помощью upи down), отображать стек вызовов (с помощью show-stack) и так далее:

посмотреть здесь:

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>)> 
конь
источник
139

Чтобы сделать это без каких-либо плагинов pry (у меня были проблемы с pry-stack_explorer), просто посмотрите caller.

На самом деле я ищу название своего проекта, чтобы отфильтровать все ненужные элементы стека рельсов. Например, если бы мой проект был назван, archieя бы использовал:

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

Это дает мне трассировку стека, которую я ищу.

Более короткий способ:

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

Что работает так же хорошо.

Пол Оливер
источник
1
Это круто. Я был раздражен, потому что он включал стек вызовов pry, и я просто хотел, что конкретно исходило из моего приложения. +1!
cdpalmer 08
6
Отлично. Я добавил комбинацию клавиш в tmux, чтобы ввести это (привязать 'B' send-keys '... ^ M'), используя вместо этого «отклонить», чтобы он был более общим: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide
4
Как и полагается сообществу Ruby, единственный полезный ответ скрыт под советом установить некоторые плагины.
Джесси Диллон
4
этот ответ заслуживает стольких голосов. Да, поверх pry можно установить еще кое-что. Но вы также можете использовать существующие языковые функции
Ruby, чтобы продвинуться
1
Этот ответ должен быть правильным, поскольку он не требует дополнительных плагинов!
Альваро Кавальканти
83

Существует pry-backtrace, который показывает обратную трассировку для сеанса Pry.

Еще есть wtf? . Который показывает след самого последнего исключения. Добавьте больше вопросительных знаков, чтобы просмотреть больше следов, или восклицательного знака, чтобы увидеть все.

Введите help в pry, чтобы увидеть все остальные команды :)

Gef
источник
1
pry-backtraceв порядке, но pry-stack_explorerплагин намного мощнее (хотя это еще одна жемчужина, плагин)
horseyguy
7
но факт в том, что иногда вы не используете все эти функции :)
Джунг Нгуен
1

Вы можете использовать вызывающий метод, который уже определен внутри библиотеки гемов. Возвращаемое значение этого метода будет массивом. Таким образом, вы можете применить методы массива для поиска в этой группе строк

Ниже также полезен мощный след. https://github.com/pry/pry-stack_explorer

Нишант Упадхьяй
источник
0

Продолжая ответ Пола Оливера.

Если у вас есть список фраз, которые вы хотите навсегда исключить, вы можете сделать это с помощью функции пользовательских команд в Pry.

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

Вызов callerfприведет к отфильтрованному callerвыводу. Странные знаки вокруг #{output}раскрашены, чтобы воспроизвести первоначальный вид caller. Я взял цвет отсюда .

В качестве альтернативы, если вы не хотите создавать собственную команду, используйте Ctrl+Rдля поиска в истории команд.

Sloneorzeszki
источник
Он находится в домашней папке ~/.pryrc. Если нет, просто создайте его. ~/всегда означает домашнюю папку в системах Unix.
sloneorzeszki