Pry: покажи мені стопку


101

Використовуючи Pry in Rails, коли я потрапив на точку розриву в коді прив'язки

Я хочу знати, як я потрапив сюди, хто мене дзвонив, хто їх дзвонив і т. Д. Але як не дивно, я не бачу цієї команди. Хтось знає?

Відповіді:


51

Використовуйте плагін pry-stack_explorer , він дозволяє переміщати стек викликів вгору та вниз (з upі down), відображати стек callsta (з 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>)> 

138

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

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

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

Що дає мені слід стека, який я шукаю.

Скороченим шляхом буде:

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

Що працює так само добре.


1
Це чудово. Я був роздратований, оскільки він включав стек виклику викликів, і я просто хотів, що конкретно виходить із моєї заявки. +1!
cdpalmer

6
Ідеально. Я додав до tmux ключ-комбо, щоб ввести це (прив’язати 'B' кнопки відправлення '... ^ M'), використовуючи натомість "відхилити", щоб це було більш загальним: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Істинна форма для спільноти Ruby, єдина корисна відповідь - це поховання під порадою про встановлення деяких плагінів.
Джессі Діллон

4
ця відповідь заслуговує стільки відгуків. Так, ви можете встановити більше матеріалів на додаток. Але ви також можете використати існуючі мовні функції рубіну, щоб пройти майже так далеко (звичайно, досить далеко, щоб відповісти на питання ОП!)
amenthes

1
Ця відповідь має бути правильною, оскільки не потребує додаткових плагінів!
Альваро Кавальканті

83

Існує pry-backtrace, який показує зворотній слід для сеансу Pry.

Є також wtf? . Яке шоу - це відстань останнього винятку. Додайте більше знаків запитання, щоб переглянути більше задніх або окличних знаків, щоб побачити все це.

Введіть довідку в програмі, щоб переглянути всі інші команди :)


1
pry-backtraceце нормально, але pry-stack_explorerплагін набагато потужніший (хоча це інший дорогоцінний камінь, плагін)
horseyguy

7
але факт буває, що ти не використовуєш усі ці можливості :)
Dzung Nguyen

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для пошуку в історії команд.


Це в домашній папці ~/.pryrc. Якщо ні, просто створіть його. ~/завжди означає домашню папку в системах Unix.
sloneorzeszki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.