Время от времени я получаю это, когда точка останова инициирована. Похоже, что стековые фреймы не становятся сохраненными, таким образом, я не могу отступить через стек вызовов - реальная боль. Посмотрите ниже для примера
--> #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"]
Какие-либо идеи о том, как остановить этот случай?
Это означает, что стек вызовов, о котором сообщает функция 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).