Почему ruby-debug говорит: «Сохраненные кадры могут быть неполными» - PullRequest
6 голосов
/ 04 мая 2010

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

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

Есть идеи, как это остановить?

1 Ответ

8 голосов
/ 07 мая 2010

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

Это может произойти, если отслеживание отладчика было активировано, когда в стеке вызовов было более одного кадра. Это также может произойти в результате ошибки в ruby-debug, когда он неправильно отслеживает. Одно из «лекарств» - поместить это в самом начале файла в основном файле: потребовать '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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...