Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Debugger spring von einer Prozedur in eine andere (https://www.delphipraxis.net/204387-debugger-spring-von-einer-prozedur-eine-andere.html)

Hobbycoder 26. Mai 2020 00:49

Debugger spring von einer Prozedur in eine andere
 
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
Delphi-Quellcode:
begin..end
, das ich nach dem
Delphi-Quellcode:
if st<>nil then
um den
Delphi-Quellcode:
Try..finally..end
gelegt habe, macht er das gleich, allerdings erst in der Zeile
Delphi-Quellcode:
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.

hoika 26. Mai 2020 04:24

AW: Debugger spring von einer Prozedur in eine andere
 
Hallo,
öffne eine Pas-Datei mal mit dem Editor (Notepad) und
suche nach "Verdächtigen, komischen" Zeichen.
Es kann sein, dass in der Pas etwas Murks drinsteht,
was der Debugger bei der Anzeige überspringt.
Dann stimmt die Zeile im Debugger nicht mit der für dich sichtbaren Zeile überein.

Außerdem solltest Du auch nach alten DCUs deiner Pas suchen.
Am besten klappt das mit Search Everything.

Durchblick bei sowas bringt auch eine einfache MessageBox.
Schreib die als ersten Befehl nach dem finally rein.
Wird die angezeigt?

Ein letzter Punkt.
Vielleicht ist eine Klasse aus Versehen schon freigegeben?
Weil nach dem try das erste Mal auf Klassenmethoden zugegriffen wird.

Hobbycoder 26. Mai 2020 12:20

AW: Debugger spring von einer Prozedur in eine andere
 
Ich habe alles Versucht. Ich habe die Datei mit einem HexEditor untersucht, aber keine Zeichen gefunden, die dort nicht hingehören.
Auch im Notepad oder Notepad++ sieht alles gut aus.

Habe alle DCU's und alles andere gelöscht, bist ich nur noch meine Projekt-Dateien hatte. Kein erfolg.

Dann bin ich bei gegangen und habe die Unit per Hand komplett neu erzeugt, und nur die Procedure-Inhalte per Copy&Paste reinkopiert. Ab da lief es dann wieder. Was da quer gegangen ist, habe ich nicht feststellen können.

hoika 26. Mai 2020 12:36

AW: Debugger spring von einer Prozedur in eine andere
 
Hallo,
hast du wirklich alle DCUs gelöscht gehabt.
Auch "Erzeugen" geklickt?

Vielleicht war ja die DCU älter als die PAS?

freimatz 26. Mai 2020 13:02

AW: Debugger spring von einer Prozedur in eine andere
 
Hm, ich habe das Problem bislang nur mit anonymen Methoden ...

Hobbycoder 26. Mai 2020 15:13

AW: Debugger spring von einer Prozedur in eine andere
 
Zitat:

Zitat von hoika (Beitrag 1465348)
Hallo,
hast du wirklich alle DCUs gelöscht gehabt.
Auch "Erzeugen" geklickt?

Vielleicht war ja die DCU älter als die PAS?

Hatte ich. Ich hatte wirklich alles aus dem Projektverzeichnis entfernt, was ich nicht zum Öffnen des Projekts benötigt habe.
Beim weiteren Rumsuchen habe ich auch bemerkt, dass er auch die automatische Vervollständigung in der Unit nicht mehr machen wollte. Warum kann ich nicht sagen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz