Überprüfen Sie den Heap in Ruby und stellen Sie ihn wieder her

8

Rubys callcc erfasst die aktuelle Fortsetzung, die anschließend aufgerufen werden kann, um das Steuerelement, aber nicht die Daten wiederherzustellen. Ich möchte die aktuelle Fortsetzung zusammen mit dem aktuellen Bild der Erinnerung erfassen.

Es scheint mir, dass die Erfassung des Heaps nicht sehr schwierig sein sollte; Ich kann mich auf ObjectSpace::each_object und ObjectSpace::dump_all oder Marshal.dump oder einfach Object.clone verlassen. Ich sehe jedoch keinen einfachen Weg, den Heap wiederherzustellen. Im Idealfall würde ich die object_id -> object -Karte durchqueren und das alte Bild des Objekts für jedes object_id wiederherstellen (und das object_id erneut hinzufügen, wenn das entsprechende Objekt GC'd wurde). Es überrascht nicht, dass es keine Api-Version auf Ruby-Ebene gibt, die mir dies ermöglicht. Ich frage mich, ob es Low-Level-Hooks zu Rubys GC gibt, die ich verwenden kann.

Jede Hilfe wird geschätzt, einschließlich Vorschläge zu alternativen Ansätzen.

    
Gowtham Kaki 06.02.2016, 16:28
quelle

2 Antworten

1

Um meine eigene Frage zu beantworten, kann Process.fork verwendet werden, um mehr oder weniger den Effekt von Heap Checkpointing und Wiederherstellung zu erreichen. Immer wenn ich den Heap checken muss, mache ich einen neuen Prozess und lasse das Kind weitermachen. Der übergeordnete Prozess enthält jetzt den Checkpointed-Heap:

%Vor%

Wenn der Status wiederhergestellt werden muss, wird der untergeordnete Prozess einfach beendet:

%Vor%

Ich verwende derzeit diese Lösung und habe bisher keine Probleme festgestellt. Ich werde diese Antwort bearbeiten, wenn ich in der Zukunft etwas finde.

    
Gowtham Kaki 11.02.2016 17:54
quelle
0

Wie wäre es, wenn du jeden auf einen Stapel schiebst? Dann können Sie vom Stapel fortfahren, um die Daten abzurufen.

Ссылка

    
Turk 10.02.2016 15:15
quelle

Tags und Links