Überwachte Ausdrücke zur Laufzeit

Für Fragen rund um die Ide und zum Debugger
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Überwachte Ausdrücke zur Laufzeit

Beitrag von kralle »

Moin,

irgend etwas mache ich glaube ich falsch.
Ich möchte den Inhalte eines Variable während der Programmausführung (in der IDE) beobachten.

In dem Codebeispiel habe ich einen Haltepunkt bei "AllowChange:=" gesetzt und in den Eigenschaften das "Halt" deaktiviert (Damit ich nicht mit F7/F8/F9 arbeiten muss).
"Datenmodul.ChangeActivePage" habe ich in die "Liste der überwachten Ausdrücke" eingepflegt.

Code: Alles auswählen

 
procedure TMainForm.PageControlChanging(Sender: TObject;
  var AllowChange: Boolean);
  // Verhindern das die Page verlassen wird wenn nicht alle Felder gefüllt sind
  begin
    AllowChange:=Datenmodul.ChangeActivePage;   // Seitenwechsel verhindern
    If not Datenmodul.ChangeActivePage then
      // Anzeige in der Statusbar funktioniert nur wenn "SimpleText:=True"
      StatusBar1.SimpleText:='Seitenwechsel nicht möglich! - Nicht alle benötigten Felder wurden ausgefüllt!'
    else
      StatusBar1.SimpleText:='';
end;
 
 


Wenn ich das Programm jetzt laufe lasse, steht der "Wert" ständig auf "<invalid>".
Wenn ich eine Aktion ausführe, die die Variable verändert, dann kommt kurz ein "evaluating", denn "blitzt" der richtige Wert auf und es wird wieder "<invalid>" angezeigt.

Der Variable wurde aber definitiv ein Wert zugewiesen.
Wieso wird der Inhalt aber nicht ständig angezeigt und kann man das ändern?

Gruß HEiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Überwachte Ausdrücke zur Laufzeit

Beitrag von wp_xyz »

Wenn der Haltepunkt in der Zeile mit "AllowChange := ..." gesetzt ist, hält das Programm an, BEVOR AllowChange geändert wird. Setze den Breakpoint mal in der folgenden Zeile, dann ist AllowChange gerade geändert worden und hat den neuen Wert. (http://wiki.lazarus.freepascal.org/IDE_ ... reakpoints)

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Überwachte Ausdrücke zur Laufzeit

Beitrag von kralle »

Moin,

wp_xyz hat geschrieben:Wenn der Haltepunkt in der Zeile mit "AllowChange := ..." gesetzt ist, hält das Programm an, BEVOR AllowChange geändert wird. Setze den Breakpoint mal in der folgenden Zeile, dann ist AllowChange gerade geändert worden und hat den neuen Wert. (http://wiki.lazarus.freepascal.org/IDE_ ... reakpoints)

das Verhalten bleibt das gleiche.
Ich hätte erwartet, wenn der Wert z.B. auf true gesetzt wird, das mir das auch ständig angezeigt wird, bis der Wert geändert wird.

Mache ich das so:

Code: Alles auswählen

 
procedure TMainForm.FormPaint(Sender: TObject);
begin
  caption:=BoolToStr(Datenmodul.ChangeActivePage);
end;


Bekomme ich eine stabile Anzeige des Inhaltes der Variable.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

martin_frb
Beiträge: 572
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: Überwachte Ausdrücke zur Laufzeit

Beitrag von martin_frb »

in den Eigenschaften das "Halt" deaktiviert


"watches" werden nur angezeigt, solange das Programm angehalten ist/bleibt.
Sobald das Programm wieder laeuft, wird die Anzeige geloescht, der Wert der Variable koennte sich ja aendern.

Da der Breakpoint nicht dauerhaft anhaelt wird auch nix angezeigt (ausser fuer ne millisekunde).

Loesung 1)
Break: yes
Autocontinue: 2000 (2 Sekunden)
Dann haelt die anzeige 2 Sekunden.

Loesung 1)
Break: no
Snapshot: yes
Dann das "History" Fenster oeffnen. Dort den gewuenschten Snapshot auswaehlen. (Muss nach jedem Durchlauf gewaehlt werden)

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Überwachte Ausdrücke zur Laufzeit

Beitrag von kralle »

Moin,

martin_frb hat geschrieben:"watches" werden nur angezeigt, solange das Programm angehalten ist/bleibt.
Sobald das Programm wieder laeuft, wird die Anzeige geloescht, der Wert der Variable koennte sich ja aendern.

Also, da ist Delphi besser, da werden die Überwachtenausdrücke bis zur nächsten Wertänderung angezeigt.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

martin_frb
Beiträge: 572
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: Überwachte Ausdrücke zur Laufzeit

Beitrag von martin_frb »

Eigentlich ne gute Idee, zumindest als Option.
Beide Anzeigen haben ihr fuer und wieder.

Patches willkommen.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Überwachte Ausdrücke zur Laufzeit

Beitrag von MacWomble »

Ich schließe mich dem Wunsch an, dass die Werte angezeigt werden, so lange diese nicht gelöscht oder überschrieben werden. Alles andere macht das Watching relativ unnütz,
Es wird invalid angezeigt - obwohl ein Wert ja tatsächlich vorhanden ist - was absolut unlogisch ist.

Wenn ich das Programm an einer beliebigen Stelle unterbreche, müssen die tatsächlichen Werte der überwachten Variablen/Ausdrücke angezeigt werden.
Alles andere ist nutzlos.

Ich sehe keinen Vorteil darin, den Wert auszublenden, weil er eventuell geändert wurde.
In Delphi wird in solch einem Fall eben richtigerweise der geänderte Wert angezeigt.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

martin_frb
Beiträge: 572
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: Überwachte Ausdrücke zur Laufzeit

Beitrag von martin_frb »

In Delphi wird in solch einem Fall eben richtigerweise der geänderte Wert angezeigt.


"richtige wert" ist eine Falschaussage. Stoppe in einer Prozedure, und zeige eine lokale variable an. Lass das Programm weiterlaufen. Nimm an die Prozedure ist zu ende, und wird vorerst nicht wieder aufgerufen. Dann gibt es die Variable nicht, da kann es auch keinen richtigen Wert geben.
Es muesste der "zuletzt ermittelte Wert" heissen. (Und der kann eben mittlerweile falsch sein).

Der "zuletzt ermittelte Wert" kann trotzdem nuetzlich sein.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Überwachte Ausdrücke zur Laufzeit

Beitrag von MacWomble »

so hatte ich das auch gemeint, mich aber falsch ausgedrückt. Der 'zuletzt zugewiesene Wert' war natürlich gemeint.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Überwachte Ausdrücke zur Laufzeit

Beitrag von kralle »

Moin,

in meinem Beispiel geht es um die Variable "Datenmodul.ChangeActivePage".
Wie der Namensanteil "Datenmodul" schon vermuten lässt, ist dieses eine Variable die Global für alle Units erreichbar ist.

Bei so einer Variable müsste doch immer ein Wert in der Variable enthalten sein oder ?

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Antworten