AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Debugger spring von einer Prozedur in eine andere
Thema durchsuchen
Ansicht
Themen-Optionen

Debugger spring von einer Prozedur in eine andere

Ein Thema von Hobbycoder · begonnen am 26. Mai 2020 · letzter Beitrag vom 26. Mai 2020
Antwort Antwort
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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Debugger spring von einer Prozedur in eine andere

  Alt 26. Mai 2020, 05:24
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.
Heiko
  Mit Zitat antworten Zitat
Hobbycoder

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

AW: Debugger spring von einer Prozedur in eine andere

  Alt 26. Mai 2020, 13:20
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Debugger spring von einer Prozedur in eine andere

  Alt 26. Mai 2020, 13:36
Hallo,
hast du wirklich alle DCUs gelöscht gehabt.
Auch "Erzeugen" geklickt?

Vielleicht war ja die DCU älter als die PAS?
Heiko
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.444 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Debugger spring von einer Prozedur in eine andere

  Alt 26. Mai 2020, 14:02
Hm, ich habe das Problem bislang nur mit anonymen Methoden ...
  Mit Zitat antworten Zitat
Hobbycoder

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

AW: Debugger spring von einer Prozedur in eine andere

  Alt 26. Mai 2020, 16:13
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Antwort Antwort


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:45 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