Pry: cho tôi xem ngăn xếp


101

Sử dụng Pry trong Rails, khi tôi đạt được điểm ngắt trong mã ràng buộc.

Tôi muốn biết làm thế nào tôi đến được đây, ai đã gọi cho tôi, ai đã gọi cho họ, v.v. Nhưng kỳ lạ là tôi không thấy lệnh đó. Có ai biết không?

Câu trả lời:


51

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 updown), 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>)> 

138

Để 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à, archietô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.


1
Điều đó thật tuyệt. Tôi đã khó chịu vì nó bao gồm ngăn xếp cuộc gọi khẩn cấp và tôi chỉ muốn những gì cụ thể đến từ ứng dụng của mình. +1!
cdpalmer

5
Hoàn hảo. Tôi đã thêm một key-combo để tmux nhập này (bind 'B' send-phím '... ^ M'), sử dụng một 'từ chối' thay vì vậy nó chung chung hơn: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Đúng như hình thức dành cho cộng đồng Ruby, câu trả lời hữu ích duy nhất được chôn giấu bên dưới lời khuyên để cài đặt một số plugin.
Jesse Dhillon

4
câu trả lời này xứng đáng nhận được rất nhiều ủng hộ. Có, bạn có thể cài đặt nhiều thứ hơn trên pry. Nhưng bạn cũng có thể sử dụng ngôn ngữ hiện có ruby của các tính năng để có được gần như xa (chắc chắn đủ xa để trả lời câu hỏi của OP!)
amenthes

1
Câu trả lời này phải là câu trả lời chính xác vì nó không yêu cầu plugin bổ sung!
Alvaro Cavalcanti

83

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 :)


1
pry-backtracelà ok, nhưng pry-stack_explorerplugin là cách mạnh mẽ hơn (mặc dù đó là một viên ngọc, một plugin)
horseyguy

7
nhưng thực tế là đôi khi bạn không sử dụng tất cả những tính năng :)
Dũng Nguyễn

1

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


0

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 callerfsẽ 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.


Nó nằm trong thư mục chí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.
sloneorzeszki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.