Hallo zusammen,
ich möchte Log-Files bei Crash aufnehmen, und damit möglichst nah an den Crash-Punkt herankommen.
Das Ganze sollte auch auf allen Platformen laufen, aber mir geht es erstmal um eine grundsätzliche Frage.
Die Klassen hängen wie folgt zusammen:
Delphi-Quellcode:
TStream =
class(TObject);
//<-- TStream hat kein explizites Destroy
THandleStream =
class(TStream)
protected
FHandle: THandle;
//<-- hat kein explizites Destroy, hält nur den Handle
TFileStream =
class(THandleStream)
destructor TFileStream.Destroy;
begin
if FHandle <> INVALID_HANDLE_VALUE
then
FileClose(FHandle);
inherited Destroy;
end;
//<-- Handle wird hier entsorgt und womöglich erst jetzt in ein physikalisches File geschrieben
TBufferedFileStream =
class(TFileStream)
destructor TBufferedFileStream.Destroy;
begin
SyncBuffer(False);
//<-- Der Memory-Buffer wird in das File geschrieben
FreeMem(FBuffer, FBufferSize);
inherited Destroy;
end;
//<-- Buffer wird erst geschrieben, und dann mit inhertied in ein physikalisches File geschrieben
Zum Logging halte ich jetzt
einen globalen TFileStream offen, in dem die Logs geschrieben werden.
TFileStream
Wenn
jetzt irgendwo ein Crash auftritt, wie
verhält sich das noch offene File ?
Wer
ruft TFileStream.Destroy auf, ist sichergestellt das sich
alle Scopes korrekt abbauen ?
Ist es irgenwie garantiert (Delphi/jeweiliges
OS) dass
das offene File-Handle trotz Crash geschlossen wird ?
Wie verhält sich der OS-Cache in einem solchen Fall, gehen die Daten im Cache verloren (Unterschiede Win/iOS/Android/Mac ...) ?
Kann es sein dass
das physikalische File im System offen bleibt (Unterschiede Win/iOS/Android/Mac ...) ?
TBufferedFileStream
Wenn ich jetzt
statt TFileStream TBufferedFileStream benutze:
Es kommt noch
das FlushBuffer in die Ablaufkette hinzu.
Wird das TBufferedFileStream.Destroy garantiert aufgerufen, oder kann der Buffer verlorengehen ?
Meine Vermutung ist das es sowohl bei TFileStream als auch TBufferedFileStream Datenverluste geben kann, und der letzte Stand verloren gehen kann.
Gibt es vielleicht einen versteckten Mechanismus (
Exception-Handler) in Delphi, der den Datenverlust verhindern könnte.
Ist es jetzt besser TFileStream oder TBufferedFileStream für das Loggen zu Verwenden ?
Sorry, viele Fragen, aber vielleicht gibt es ja eine einfache Antwort