Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten (Problem gelöst)

Für Fragen rund um die Ide und zum Debugger
Antworten
Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten (Problem gelöst)

Beitrag von Frank Ranis »

Hallo,

habe in einem größeren Programm immer wieder Probleme beim Anzeigen von lokalen Variablen-Werten , wenn ich Debugge und Haltepunkte setzte.
Betrifft meist Unterprograme wie dieses hier

Code: Alles auswählen

// Berechnet den Geschwindigkeitsvektor des Wirbelstückes
// A->B mit der Zirkulationsstärke gamma im Aufpunkt P
function biot_savart(gamma:double;Vek_A,Vek_B,Vek_P:punkt3d):punkt3d;
var r0, // Abstandsvektor B-A
    r1, // Abstandsvektor P-A
    r2, // Abstandsvektor P-B
    Q_Vek_P // induzierter Geschwindgkeitsvektor im Aufpunkt
    :punkt3d;

    B,Bo,D:punkt3d;
    Bu,A,C,C1,C2:double;

begin
 // Berechnung der Abstandsvektoren zwischen den Punkten
 // Abstandsvektor B-A
 r0:=SubVectors(Vek_B,Vek_A);
 // Abstandsvektor P-A
 r1:=SubVectors(Vek_P,Vek_A);
 // Abstandsvektor P-B
 r2:=SubVectors(Vek_p,Vek_B);

 A:=gamma/4/pi; // Gamma mit Faktor 1/(4*pi) verrechnen
 Bo:=Cross(r1,r2);
 Bu:=Vektorbetrag(Cross(r1,r2))*
     Vektorbetrag(Cross(r1,r2));
 B:=ScaleVector(Bo,1/Bu);
 C1:=Dot(r0,r1)/Vektorbetrag(r1);
 C2:=Dot(r0,r2)/Vektorbetrag(r2);
 C:=C1-C2;
 D:=ScaleVector(B,A);
 Q_Vek_P:=ScaleVector(D,C);

 result:=Q_Vek_P;
end; // <---- hier einen Haltepunkt
Es gibt dann so einige Variablen , für die man keine Werte angezeigt bekommt , sondern nur ???.

Hier ein Bild vom Debugg-Fenster-Lokale-Variablen
Lokale_Variablen.png
Lokale_Variablen.png (40.09 KiB) 3192 mal betrachtet
Alle Variablen , die im Bild mit "Failed to read data from register" gekennzeichnet sind lassen sich auch im Quellcode nicht anzeigen.
Die übrigen Variablen schon.

Was kann das für ein Problem sein ?
Die Berechnungs-Ergebnisse der Routine sind völlig OK .
Ich habe auch versucht , ein neues Minimal-Projekt mit der Funktion oben zu bauen , aber da tritt das Problem dummerweise nicht auf.
In dem Großprogramm stecken ja tausende Variablen , ist der Debugger damit überfordert ?

Meine Laz-Version :
Lazarus 2.2.4 (rev lazarus_2_2_4-0-g06a78ed923) FPC 3.2.2 x86_64-win64-win32/win64

Gruß

Frank
Zuletzt geändert von Frank Ranis am Fr 16. Aug 2024, 12:11, insgesamt 2-mal geändert.
www.flz-vortex.de

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von Zvoni »

Passiert dasselbe, wenn du die genannten Variablen explizit unter "Überwachung" stellst? ("Watch-Window")
Das einzige was mir auffällt ist, dass es double's sind
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

around5
Beiträge: 16
Registriert: Fr 16. Aug 2024, 08:14

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von around5 »

Ich rate jetzt ins Blaue: Da die Double-Werte (inkl. der Parameter Gamma) sicher im Stack landeten, vermute ich, dass beim Breakpoint "end" der Stack bereits wieder "leer" (geräumt) ist. Evtl. versuchen eine Anweisung zuvor den Breakpoint zu setzen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von af0815 »

Nur ein Hinweis, gerade beim Debugger hat sich mit den neuen Lazarusversionen unheimlich viel getan. Und tut sich weiterhin sehr viel, da ist auch zwischen Lazarus stable und dem aktuellen Trunk wieder viel passiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von Frank Ranis »

Hi ,
around5 hat geschrieben: Fr 16. Aug 2024, 08:19 Ich rate jetzt ins Blaue: Da die Double-Werte (inkl. der Parameter Gamma) sicher im Stack landeten, vermute ich, dass beim Breakpoint "end" der Stack bereits wieder "leer" (geräumt) ist. Evtl. versuchen eine Anweisung zuvor den Breakpoint zu setzen.
Aber bei meinem Minimalprojekt klappt es ja genau so mit dem Breakpoint ohne Probleme .
Es ist halt nur 1/10000stel der Größe meiner Problem Anwendung .

Im Debugg-Fenster-Lokale-Variablen sieht es dann so aus.
Lokale_Variablen_1.png
Lokale_Variablen_1.png (35.83 KiB) 3172 mal betrachtet
Alle Variablen-Inhalte sind da und auch im Quellcode werden die Werte angezeigt , wenn ich mit der Maus drüberfahre.

Gruß

Frank
www.flz-vortex.de

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von Frank Ranis »

Hi ,
af0815 hat geschrieben: Fr 16. Aug 2024, 08:31 Nur ein Hinweis, gerade beim Debugger hat sich mit den neuen Lazarusversionen unheimlich viel getan. Und tut sich weiterhin sehr viel, da ist auch zwischen Lazarus stable und dem aktuellen Trunk wieder viel passiert.
Ok , habe mir mal per FPCUPdeluxe die aktuelle Version
Lazarus 3.4 (rev 34295aa4) FPC 3.2.2 x86_64-win64-win32/win64
installiert.

Gleiche faule Ergebnis wie in meinen erste Beitrag oben.

Beim Versuch Trunk zu installieren ist mir FPCUPdeluxe abgekackt .
Zvoni hat geschrieben: Fr 16. Aug 2024, 08:06 Passiert dasselbe, wenn du die genannten Variablen explizit unter "Überwachung" stellst? ("Watch-Window")
Das einzige was mir auffällt ist, dass es double's sind
Dann mal ein paar Variablen in überwachte Ausdrücke reingepackt.
Können auch nicht gelesen werden .
Das sieht dann so aus .
Lokale_Variablen_2.png
Lokale_Variablen_2.png (15.94 KiB) 3148 mal betrachtet
Kann man beim Debugger eventuell irgendwelche Speichergrößen festlegen ?

Gruß

Frank
www.flz-vortex.de

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von Frank Ranis »

Hi,

mal ein anderer etwas verzweifelter Versuch , um die Werte anzuschauen.

Habe mir eine Werte-Array als Zwischenspeicher eingebaut.

Code: Alles auswählen

// Berechnet den Geschwindigkeitsvektor des Wirbelstückes
// A->B mit der Zirkulationsstärke gamma im Aufpunkt P
function biot_savart(gamma:double;Vek_A,Vek_B,Vek_P:punkt3d):punkt3d;
var r0, // Abstandsvektor B-A
    r1, // Abstandsvektor P-A
    r2, // Abstandsvektor P-B
    Q_Vek_P // induzierter Geschwindgkeitsvektor im Aufpunkt
    :punkt3d;

    B,Bo,D:punkt3d;
    Bu,A,C,C1,C2:double;

var werte:array[0..5] of double; // <------ Zwischenspeicher 

begin
 // Berechnung der Abstandsvektoren zwischen den Punkten
 // Abstandsvektor B-A
 r0:=SubVectors(Vek_B,Vek_A);
 // Abstandsvektor P-A
 r1:=SubVectors(Vek_P,Vek_A);
 // Abstandsvektor P-B
 r2:=SubVectors(Vek_p,Vek_B);

 A:=gamma/4/pi; // Gamma mit Faktor 1/(4*pi) verrechnen
 Bo:=Cross(r1,r2);
 Bu:=Vektorbetrag(Cross(r1,r2))*
     Vektorbetrag(Cross(r1,r2));
 B:=ScaleVector(Bo,1/Bu);
 C1:=Dot(r0,r1)/Vektorbetrag(r1);
 C2:=Dot(r0,r2)/Vektorbetrag(r2);
 C:=C1-C2;
 D:=ScaleVector(B,A);
 Q_Vek_P:=ScaleVector(D,C);

 // Die verweigerten Variablen ins Array packen.
 werte[0]:=gamma;
 werte[1]:=A;
 werte[2]:=Bu;
 werte[3]:=c;
 werte[4]:=c1;
 werte[5]:=c2;

 result:=Q_Vek_P;
end; // <------- Haltepunkt
Hier das Bild der lokalen Variablen .
Jetzt kann ich zumindest den Inhalt betrachten , ein Krücke.
Der Debugger hat mit diesem Array jetzt keine Probleme und das sind auch Double-Typen
Lokale_Variablen_3.png
Lokale_Variablen_3.png (42.71 KiB) 3143 mal betrachtet
Gruß

Frank
www.flz-vortex.de

around5
Beiträge: 16
Registriert: Fr 16. Aug 2024, 08:14

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von around5 »

Um der Ursache des Problems etwas näher zu kommen folgender Vorschlag:
Den BreakPoint auf die erste Anweisung "r0:=..." setzen, dann den Inhalt der (aller) Variablen überprüfen (mouse-over, ...), und nach jedem Einzelschritt wieder die Variablen überprüfen. Ab wann tritt das Problem auf?

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von Zvoni »

Welcher Debugger übrigens? gdb oder fpdebug?
Übrigens: Auch explizit Debug (Release)-Mode?
Welcher Debugging-Info-Typ? Dwarf? Mit Sets? Dwarf2 oder 3? Stabs?
HeapTrc? Trash?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von martin_frb »

Ok, Es gibt verschiedene mögliche Ursachen.

1) Kompiliert mit -O2 oder höher (oder explizit mit Anweisung den Stackframe weg zu optimieren IIRC -Oonostackframe ??)

2) Pausiert auf begin oder end
Dort sind lokale variablen noch nicht (nicht mehr) verfügbar. Sie sind noch nicht aus den Registern in den lokalen Stack kopiert.
FPC liefert in der Debug info keine Verweise auf Register.
Achtung, wenn gdb auf der "begin" Zeile stoppte schummelt es, und stoppt erst in der Mitte des asm Code für diese Zeile (gdb erkennt den asm Code zum einrichten des Stack (teilweise) und überspringt ihn). Dann sind die Werte zwar lesbar, aber nicht immer korrekt.

3) anderes ?

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten

Beitrag von Frank Ranis »

Hi,
martin_frb hat geschrieben: Fr 16. Aug 2024, 11:38 Ok, Es gibt verschiedene mögliche Ursachen.

1) Kompiliert mit -O2 oder höher (oder explizit mit Anweisung den Stackframe weg zu optimieren IIRC -Oonostackframe ??)

2) Pausiert auf begin oder end
Dort sind lokale variablen noch nicht (nicht mehr) verfügbar. Sie sind noch nicht aus den Registern in den lokalen Stack kopiert.
FPC liefert in der Debug info keine Verweise auf Register.
Achtung, wenn gdb auf der "begin" Zeile stoppte schummelt es, und stoppt erst in der Mitte des asm Code für diese Zeile (gdb erkennt den asm Code zum einrichten des Stack (teilweise) und überspringt ihn). Dann sind die Werte zwar lesbar, aber nicht immer korrekt.

3) anderes ?
Punkt 1) das ist der Bock .

Kompilieren_Linken1.png
Kompilieren_Linken1.png (54.58 KiB) 3127 mal betrachtet

Ein Kollege hatte mir vor ein paar Monanten dazu geraten mal die Stufe2 zu probieren , um Rechen-Geschwindigkeiten zu erhöhen.

Benutze ich die Stufe0 oder Stufe1 , dann kann ich meine Variablen wieder lesen.

Kompilieren_Linken2.png
Kompilieren_Linken2.png (53.89 KiB) 3127 mal betrachtet

Martin , Du bist der Größte .
Das ganze Lazarus-Forum ist BIG BIG BIG .
Und Lazarus / Free Pascal sowieso .

Problem gelöst und ich hoffe alle haben wieder was gelernt .

Gruß

Frank

PS: Wenn ich übrigens in meinem Minimal-Test-Projekt die Stufe2 einschalte , fangen die Probleme wieder an .
Dort hat es halt normal funktioniert , weil ich eine neues Projekt geöffnet habe und Stufe1 voreingestellt ist .
www.flz-vortex.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Probleme bei Debuggen und Anzeigen von lokalen Variablen-Inhalten (Problem gelöst)

Beitrag von fliegermichl »

@Frank Ranis,

Editiere bitte deinen allerersten Post und schreibe [gelöst] oder so in den Betreff.

Antworten