Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Debugger spring von einer Prozedur in eine andere

  Alt 26. Mai 2020, 01:49
Hi,

ich habe mal ein sehr merkwürdiges Problem. Ich habe ein TObjectList mit ein Save-to-Filestream-Methode. Das eigentliche Problem war, dass er mir Daten nicht in die Datei geschrieben hat. Um das zu Prüfen bin ich Schrittweise durch die Prozedur gegangen. Dabei ist mir aufgefallen, dass er dann von einer Procedure in eine andere Procedure springt, obwohl im Code an der Stelle überhaupt keine Veranlassung dazu gibt.
Hier mal der Codeteil um den es sich handelt:
Delphi-Quellcode:
procedure TBackupList.SaveToFile(Filename: string);
var
  st: TFileStream;
  i: Integer;
begin
  if Filename<>'then FFilename:=Filename;
  if DirectoryExists(ExtractFilePath(FFilename)) then
  begin
    st:=TFileStream.Create(FFilename, fmCreate);
    if st<>nil then
    begin
      try //<----von hier springt er mit F7 (Einzelschritt)
        WriteIntToStream(st, Version);
        WriteStrToStream(st, self.FServerName);
        WriteDateTimeToStream(st, self.FStartTime);
        WriteDateTimeToStream(st, self.FEndTime);
        WriteBoolToStream(st, self.FSuccess);
        WriteInt64ToStream(st, self.FTotalDataSize);
        WriteInt64ToStream(st, self.FTotalBackupSize);
        WriteIntToStream(st, self.Count);
        for I := 0 to self.Count-1 do
          self[i].WriteToStream(st);
      finally
        st.Free;
      end;
    end;
  end;
end;

procedure TBackupList.SetEndTime(Value: TDateTime);
begin
  FEndTime:=Value;
end; //<----direkt nach hier
Also vom Try mal direkt zum end der nächsten Procedure. Wenn die aktuelle Programmzeile noch auf Try steht, sind alle Variablen wie erwartet vorhanden. Wenn ich dann mit F7 einen Schritt weitergehen will, und er danach auf dem end der nächsten Procedure steht, kann ich im Debugger noch das Handle des Filestreams sehen. Auf alle anderen Variablen kann er nicht mehr zugreifen.

Es laufen keine Threads, die mir dazwischenfunken könnten. Ich habe auch schon mal die Pas-Datei mit einem HexEditor untersucht, ob vielleicht irgendwelche unsichtbaren Zeichen irgendwo sind, aber alle nur Leerzeichen, CR und LF.
Ich habe schon bereinigt, das Debug und Release Verzeichnis komplett leer gemacht und Delphi neu gestartet. Immer nahezu das gleiche verhalten.
Entferne ich jedoch das begin..end , das ich nach dem if st<>nil then um den Try..finally..end gelegt habe, macht er das gleich, allerdings erst in der Zeile WriteIntToStream(st, Version); Das Problem tritt sowohl in der Debug- als auch in der Release-Konfiguration auf.

Die ganze WriteXXXToStream-Routinen verwende ich schon jahrelang, die können nicht fehlerhaft sein. Außerdem müsste dann ja zum Finally springen.

Dann habe ich die Procedure SetEndTime im Code mal etwas nach unten verschoben. Interessiert ihn nicht, dann lande ich direkt bei end der Procedure, die dann auf die SavaToFile folgt.

Auch hole ich mir die Daten in der SaveToFile-Procedure aus den privaten Variable und habe an der Stelle mit den Settern gar nichts zu tun.

Ich bin ein bisachen Ratlos.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (26. Mai 2020 um 01:55 Uhr)
  Mit Zitat antworten Zitat