2010-05-04 25 views
5

Thỉnh thoảng tôi nhận được điều này khi một điểm ngắt được kích hoạt. Dường như các khung ngăn xếp không được lưu vì vậy tôi không thể lùi lại qua ngăn xếp cuộc gọi - một nỗi đau thực sự. Xem bên dưới để biết ví dụTại sao gỡ lỗi ruby ​​nói 'Khung đã lưu có thể không đầy đủ'

--> #0 BatchProcess.add_failure_record(row_id#Fixnum, test#Struct::Test, message#String,...) 
     at line server/processes/batch.rb:309 
Warning: saved frames may be incomplete; compare with caller(0). 
(rdb:1) pp caller 
["./server/processes/batch.rb:309:in `run_tests'", 
"./server/processes/common/generic_process.rb:219:in `each'", 
"./server/processes/common/generic_process.rb:219:in `run_tests'", 
"./server/processes/common/generic_process.rb:271:in `run_plan'", 
"./server/processes/common/corrections.rb:19:in `each_with_index'", 
"./server/processes/common/generic_process.rb:266:in `each'", 
"./server/processes/common/generic_process.rb:266:in `each_with_index'", 
"./server/processes/common/generic_process.rb:266:in `run_plan'", 
"./server/processes/batch.rb:202:in `run_engine'", 
"/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'", 
"./server/processes/batch.rb:201:in `run_engine'", 
"./server/processes/common/generic_process.rb:88:in `run_dataset'", 
"./server/processes/batch.rb:210:in `run_dataset'", 
"/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'", 
"./server/processes/batch.rb:209:in `run_dataset'", 
"./server/processes/common/generic_process.rb:159:in `run'", 
"./server/processes/common/generic_process.rb:158:in `each'", 
"./server/processes/common/generic_process.rb:158:in `run'", 
"./server/processes/batch.rb:350:in `run'", 
"/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'", 
"./server/processes/batch.rb:349:in `run'", 
"server/processes/test_runs/run_tests.rb:55:in `run_one_process'", 
"server/processes/test_runs/run_tests.rb:81"] 

Bất kỳ ý tưởng nào về cách dừng điều này xảy ra?

Trả lời

7

Điều đó có nghĩa là ngăn xếp cuộc gọi được báo cáo bởi hàm caller() của Ruby không khớp với những gì trình gỡ lỗi đã ghi lại làm ngăn xếp cuộc gọi.

Điều này có thể xảy ra nếu theo dõi trình gỡ lỗi được kích hoạt trong khi ngăn xếp cuộc gọi có nhiều hơn một khung trong đó. Nó cũng có thể xảy ra do lỗi trong quá trình gỡ lỗi ruby ​​khi nó không theo dõi chính xác. Một "biện pháp khắc phục" là đặt điều này vào lúc bắt đầu của tệp trong tệp chính: yêu cầu 'gỡ lỗi ruby'; Debugger.start

Tuy nhiên, nhược điểm của việc này là có thêm một số phí bổ sung ngay từ đầu chương trình.

Một nơi nào đó trong mã Ruby của bạn, bạn phải thông báo cho Ruby để bắt đầu theo dõi cuộc gọi và trả lại. Thông thường, điều này được thực hiện thông qua sự kết hợp của Debugger.start và Debugger.stop hoặc Debugger.start {}. Nếu bạn đang chạy từ một khung công tác, các lệnh này được phát hành ở đâu đó cho bạn, vì vậy trách nhiệm phát hành ở đúng chỗ dựa trên lập trình viên đã thêm mã này.

Cuối cùng, xuống dòng, tôi sẽ thay đổi thông điệp rõ ràng hơn một chút:

Warning: saved frames may be incomplete; 
compare debugger backtrace (bt) with Ruby caller(0). 
+0

cám ơn Rocky. Tiếp theo thời gian nó xảy ra tôi sẽ thử Debugger.start workaround –

+0

Tôi nhấn vấn đề đó một lần nữa và giải pháp của bạn làm việc. Toàn điểm cho bạn! –

+0

Tôi không chắc chắn liệu thông báo mới này có mang tính thông tin hay không. Có lẽ tốt hơn để có nó chứa một cái gì đó như "Hãy xem xét gọi điện thoại" yêu cầu "ruby gỡ lỗi" \ n Debugger.start khi bắt đầu chương trình của bạn. " – Smar

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