Почему рубиновая отладка говорит, что 'Сохраненные кадры могут быть неполными'

Время от времени я получаю это, когда точка останова инициирована. Похоже, что стековые фреймы не становятся сохраненными, таким образом, я не могу отступить через стек вызовов - реальная боль. Посмотрите ниже для примера

--> #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"]

Какие-либо идеи о том, как остановить этот случай?

6
задан Chris McCauley 19 May 2010 в 10:20
поделиться

1 ответ

Это означает, что стек вызовов, о котором сообщает функция Ruby caller(), не совпадает с тем, что записал отладчик в качестве стека вызовов.

Это может произойти, если отслеживание отладчика было активировано, когда в стеке вызовов было более одного кадра. Это также может произойти в результате ошибки в ruby-debug, когда он не отслеживает правильно. Одно из "лекарств" - поместить это в самое начало файла в главном файле: require 'ruby-debug'; Debugger.start

Однако недостатком этого является то, что в самом начале программы добавляются дополнительные накладные расходы.

Где-то в коде Ruby вы должны указать Ruby начать отслеживать вызовы и возвраты. Обычно это делается с помощью комбинации Debugger.start и Debugger.stop или Debugger.start { }. Если вы работаете из фреймворка, эти команды выдаются где-то за вас, поэтому ответственность за выдачу в нужном месте лежит на программисте, который добавил этот код.

Наконец, в дальнейшем я изменю сообщение на более явное:

Warning: saved frames may be incomplete; 
compare debugger backtrace (bt) with Ruby caller(0).
8
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: