Câu trả lời:
Sử dụng plugin pry-stack_explorer , nó cho phép bạn di chuyển lên và xuống ngăn xếp cuộc gọi (với up
và down
), hiển thị ngăn xếp lệnh gọi (với show-stack
), v.v.
xem ở đây:
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>)>
Để thực hiện việc này mà không cần bất kỳ plugin pry nào (tôi đang gặp sự cố với pry-stack_explorer), chỉ cần xem caller
.
Tôi thực sự tìm kiếm tên dự án của mình để lọc ra tất cả các mục ngăn xếp đường ray không liên quan. Ví dụ: nếu tên dự án của tôi là, archie
tôi sẽ sử dụng:
caller.select {|line| line.include? "archie" }
Điều đó cho tôi dấu vết ngăn xếp mà tôi đang tìm kiếm.
Một cách ngắn hơn sẽ là:
caller.select {|x| x["archie"] }
Mà hoạt động tốt.
caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
Có pry-backtrace mà chương trình là backtrace cho phiên Pry.
Ngoài ra còn có wtf? . Chương trình nào là dấu vết của ngoại lệ gần đây nhất. Thêm các dấu chấm hỏi khác để xem thêm dấu tích hoặc dấu chấm than để xem tất cả.
Nhập trợ giúp trong pry để xem tất cả các lệnh khác :)
pry-backtrace
là ok, nhưng pry-stack_explorer
plugin là cách mạnh mẽ hơn (mặc dù đó là một viên ngọc, một plugin)
Bạn có thể sử dụng phương thức người gọi đã được xác định bên trong thư viện đá quý. Giá trị trả về của phương thức đó sẽ là một mảng. Vì vậy, bạn có thể áp dụng các phương thức mảng để tìm kiếm trong nhóm các dòng đó
Dưới đây cũng hữu ích cho việc theo dõi mạnh mẽ. https://github.com/pry/pry-stack_explorer
Mở rộng câu trả lời của Paul Oliver.
Nếu bạn có một danh sách các cụm từ mà bạn muốn loại trừ vĩnh viễn, bạn có thể làm điều đó với tính năng lệnh tùy chỉnh trong Pry.
Trong ~/.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
Việc gọi callerf
sẽ dẫn đến một caller
đầu ra được lọc . Các dấu hiệu kỳ lạ xung quanh #{output}
được tô màu để tái tạo giao diện ban đầu của caller
. Tôi lấy màu từ đây .
Ngoài ra, nếu bạn không muốn thực hiện một lệnh tùy chỉnh, hãy sử dụng Ctrl+R
để tìm kiếm trong lịch sử lệnh.
~/.pryrc
. Nếu không, chỉ cần tạo nó. ~/
luôn có nghĩa là thư mục chính trên hệ thống Unix.