![]() |
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:
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.
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 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:
, das ich nach dem
begin..end
Delphi-Quellcode:
um den
if st<>nil then
Delphi-Quellcode:
gelegt habe, macht er das gleich, allerdings erst in der Zeile
Try..finally..end
Delphi-Quellcode:
Das Problem tritt sowohl in der Debug- als auch in der Release-Konfiguration auf.
WriteIntToStream(st, Version);
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. |
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. |
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. |
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? |
AW: Debugger spring von einer Prozedur in eine andere
Hm, ich habe das Problem bislang nur mit anonymen Methoden ...
|
AW: Debugger spring von einer Prozedur in eine andere
Zitat:
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 11:02 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 by Thomas Breitkreuz