AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Verhalten von TFileStream/TBufferedFileStream bei Crash
Thema durchsuchen
Ansicht
Themen-Optionen

Verhalten von TFileStream/TBufferedFileStream bei Crash

Ein Thema von Rollo62 · begonnen am 26. Mai 2020 · letzter Beitrag vom 26. Mai 2020
 
Rollo62

Registriert seit: 15. Mär 2007
4.168 Beiträge
 
Delphi 12 Athens
 
#1

Verhalten von TFileStream/TBufferedFileStream bei Crash

  Alt 26. Mai 2020, 10:15
Delphi-Version: 10.3 Rio
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
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz