2012-05-03 37 views
8

Tôi đang nhận được SystemStackError trong ứng dụng Rails 3.Mức ngăn xếp quá sâu trong các cuộc gọi lại đang kích hoạt

Tất cả các thông tin mà tôi có là vô ích một dòng của một stacktrace (lấy từ nhật ký):

SystemStackError (stack level too deep): 
    activesupport (3.2.3) lib/active_support/callbacks.rb:409 

Vậy câu hỏi là làm thế nào để tôi thấy chồng đầy đủ dấu vết?

LƯU Ý: Tôi không quan tâm đến lý do tại sao điều này xảy ra, tất cả tôi muốn là để xem là nơi nó xảy ra.

Sử dụng: Đường ray 3.2.3, Kỳ lân.

Cảm ơn.

+0

Tìm thấy [trang này] (https://github.com/collectiveidea/delayed_job/issues/349). Không chắc chắn nếu nó giúp. –

+0

Một công ty thường xuyên xuất hiện trong thanh bên Careers 2.0 [yêu cầu cung cấp khả năng hiển thị tốt vào chi tiết của các ứng dụng đang chạy] (http://newrelic.com/ruby) - có lẽ họ có các công cụ có thể định kỳ lưu trữ dấu vết ngăn xếp cho bạn và bắt một "sâu trong" hành động "trước khi nó dẫn đến một lỗi? – sarnold

+0

@Riateche vấn đề đó xảy ra trong Rails <3.2.3. Tôi đang ở trên 3.2.3. –

Trả lời

3

Đó là mã khá phức tạp trong lib/active_support/callbacks.rb, nhưng có vẻ như nó đang áp dụng callbacks khác nhau:: trước ,: sau,: xung quanh, chính xác.

Bạn có thể thử đặt kiểu cũ "đặt trướC# {name}" trước dòng 426 và xem những gì bạn nhận được.

Tương tự, có thể là toàn bộ dấu vết ngăn xếp nằm trong ngăn xếp đường ray và nó đang được lọc ngược theo mặc định backtrace_filter. Việc đặt backtrace_filter đó có thể cho phép bạn xem ngăn xếp và nhận được manh mối gỡ lỗi. Xem config/initializers/backtrace_silencers.rb và bỏ ghi chú:

Rails.backtrace_cleaner.remove_silencers!

0

Đây là một shot trong phi tiêu nhưng tôi nhấn một cái gì đó như thế này một lần khi tôi đã có tham chiếu vòng tròn trong validates_associated 's tôi

+1

Vâng, đó là cảnh quay trong bóng tối. Và không, không có gì để làm với việc xác nhận. Tôi biết điều gì gây ra nó. Tôi không quan tâm * TẠI SAO * nó xảy ra. Tôi muốn biết * nơi * (vì vậy muốn xem callstack). –

5

Nếu bạn cập nhật một bản ghi hoạt động trong nó before_save hoặc after_save, nó sẽ tiếp tục vòng lặp. ... Ngoài ra, nếu bạn đã validates_associated trên cả hai đầu của một hiệp hội.

Dưới đây là một ví dụ về cách một callback before_save có thể tạo ra một vòng lặp:

class Foo < ActiveRecord::Base 
    def before_save 
    self.update_attribute(:bar, 'badidea') 
    end 
end 
+0

Xin chào Andrew, bạn có nhớ đưa ra một ví dụ về cách chính xác bạn có thể "cập nhật một bản ghi hoạt động trong before_save" của nó? Cảm ơn bạn! – Alexandra

+0

Kinda khó trong một bình luận để đưa vào mã, một cái gì đó như thế này: class Foo

0

Tôi gặp sự cố tương tự. Điều khiển Actions đã được bỏ qua trước/sau bộ lọc cuối cùng sẽ lôi ra với lỗi

SystemStackError (stack level too deep): 
    activesupport (3.2.13) lib/active_support/callbacks.rb:409 

tốt nhất tôi có thể hình dung là con đường Rails thêm/loại bỏ phương pháp để gọi lại ngăn xếp sẽ tạo ra một lỗi bị căng thẳng nặng nề.

Đây là các cuộc gọi API, vì vậy tôi đã chuyển chúng sang một bộ điều khiển riêng biệt được kế thừa từ ActionController :: Base, loại bỏ nhu cầu bỏ qua bộ lọc. Điều này giải quyết được vấn đề của tôi. ApplicationController :: Kim loại có thể là một lựa chọn tốt hơn tùy thuộc vào tính năng bạn cần.

Tôi biết người hỏi không quan tâm đến lý do tại sao, nhưng tôi thấy các nhà phát triển Rails khác có thể chạy trên cùng một vấn đề và không có đề xuất ghi nhật ký nào ở trên trả lại dấu vết ngăn xếp hợp lệ cho tôi.

1

Đối với những người có thể nâng cấp lên Ruby 2.2, bạn sẽ nhận được một dấu vết stack mô tả nhiều hơn như là kết quả của công việc được thực hiện bởi Nobu trên MRI (https://bugs.ruby-lang.org/issues/6216). Chuyển sang JRuby cũng sẽ cung cấp cho một ngăn xếp sâu hơn nhiều.

Các vấn đề liên quan