2010-05-04 3 views
5

Von Zeit zu Zeit bekomme ich das, wenn ein Breakpoint ausgelöst wird. Es sieht so aus, als würden Stack-Frames nicht gespeichert, so dass ich nicht durch den Call-Stack zurücktreten kann - ein echter Schmerz. Siehe unten für ein BeispielWarum sagt Ruby-debug 'Gespeicherte Frames können unvollständig sein'

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

Irgendwelche Ideen, wie man das verhindert?

Antwort

7

Dies bedeutet, dass der Aufrufstack, wie er von Rubys caller() -Funktion gemeldet wird, nicht mit dem übereinstimmt, was der Debugger als Aufrufstapel aufgezeichnet hat.

Dies kann passieren, wenn das Debugger-Tracking aktiviert wurde, während der Aufrufstapel mehr als einen Frame enthielt. Es kann auch als Folge eines Fehlers in Ruby-Debug auftreten, wo es nicht richtig verfolgt. Ein "Heilmittel" ist es, dies ganz am Anfang der Datei in der Hauptdatei einzufügen: require 'ruby-debug'; Debugger.start

Der Nachteil davon ist jedoch, dass ein zusätzlicher Overhead vom Anfang des Programms hinzugefügt wird.

Irgendwo in Ihrem Ruby-Code müssen Sie Ruby sagen, um Anrufe zu verfolgen und zurückzukehren. In der Regel erfolgt dies über die Kombination von Debugger.start und Debugger.stop oder Debugger.start {}. Wenn Sie von einem Framework aus arbeiten, werden diese Befehle irgendwo für Sie ausgegeben, so dass die Verantwortung für die Ausgabe an der richtigen Stelle auf dem Programmierer liegt, der diesen Code hinzugefügt hat.

schließlich auf der ganzen Linie werde ich die Nachricht ändern, ein wenig mehr explizit zu sein:

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

Dank Rocky. Das nächste Mal, wenn es passiert, werde ich versuchen, die Debugger.start Workaround –

+0

Ich traf dieses Problem erneut und Ihre Lösung funktionierte. Volle Punkte für Sie! –

+0

Ich bin nicht genau sicher, ob diese neue Nachricht auch informativ ist. Vielleicht ist es besser, wenn es etwas wie "Betrachten Sie das Anrufen" enthält, benötigen Sie "ruby-debug" \ n Debugger.start beim Start Ihres Programms. " – Smar

Verwandte Themen