Debugger - Infos

Für Fragen rund um die Ide und zum Debugger
Antworten
Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Debugger - Infos

Beitrag von Cool-Tuc »

Hallo,

ist es möglich, beim Debuggen z.B. nur den eigentlichen Inhalt darzustellen? Also beispielsweise bei der Variablen "strLines" vom Type "TStringList" bekomme ich bei

Code: Alles auswählen

strLines.Count

oder

Code: Alles auswählen

strLines[i]

eine sich über mehrere Bildschirmseiten erstreckende Auflistung aller Funktionen, abgeleiteter Funktionen usw....Auch in der Liste der überwachten Audrücke bekomme ich entweder diese riesige Auflistung (in einer Zeile) oder aber einen Error (kann nicht aufgelöst werden...)...

Ich würde aber gerade beim Debuggen vielleicht nur den eigentlichn Inhalt sehen (Zahl, String....) wollen; es ist recht mühsam beim Debuggen immer mit Hilfsvariablen zu arbeiten deren Inhalt ich dann direkt sehen kann....

Danke

Udo

PS: habe immer die aktuellste Version im Einsatz

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Debugger - Infos

Beitrag von Komoluna »

Code: Alles auswählen

strLines.Count;
strLines.Strings[i];

Das kann der Debugger garnicht auflösen, da das Funktionen ist, die aufgerufen werden.

Was geht, ist das hier:

Code: Alles auswählen

var
  i: Integer;
  s: String;
begin
  i := strLines.Count;
  s := strLines.Strings[i];
  [...] //hier pausieren/breakpoint setzen und dann s und i auslesen.
end;


MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: Debugger - Infos

Beitrag von Cool-Tuc »

ja, genau das meine ich mit Hilfskonstruktion.

Code: Alles auswählen

strLines.Count;

ist zwar eine Funktion, gibt aber auch nur eine Zahl zurück. Es wäre schön, wenn man ganau diese Zahl als Rückgabewert (natürlich nur bei einfachen Datentypen) im Debugger direkt anzeigen lassen könnte, ohne Hilfsvariablen...

Udo

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Debugger - Infos

Beitrag von Komoluna »

Nein, das geht leider nicht. Wenn das Programm vom Debugger pausiert wurde, können kann nichts mehr ausgeführt werden. Auch nicht die Funktion Count.
Wenn dem so währe, wie sollte der Debugger wissen, welche Methoden er ausführen soll?
Angenommen die Free methode hätte nen Rückgabewert, und du bewegst deine Maus bei einem pausierten Programm aus versehen darüber. Der debugger würde dann die Funktion aufrufen und das Objekt löschen.
Damit landet man sofort in einer Race-condition(auch wenn das "race" ein wenig unfair ist, da das Programm ja pausiert wurde)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: Debugger - Infos

Beitrag von Bitschubser »

Komoluna hat geschrieben:Nein, das geht leider nicht.


Das möchte ich so nicht stehen lassen.
Es geht momentan in Lazarus nicht, und es ist wahrscheinlich ziemlich aufwendig zu implementieren - nicht zuletzt weil der verwendete Debugger ja schließlich mal für c konstruiert wurde.

Aber in Delphi geht das "seit Jahrzehnten".

BTW: Für mich gibt es z.Zt. nur genau 2 Gründe beruflich weiter Delphi 2010 und nicht Lazarus einzusetzen:
Das hier ist der 1. und der 2. ist gleich nebenan: Die Schwierigkeiten des Debuggers mit records und properties in Watch-Ausdrücken...

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

Re: Debugger - Infos

Beitrag von wp_xyz »

Komoluna hat geschrieben:

Code: Alles auswählen

strLines.Count;
strLines.Strings[i];

Das kann der Debugger garnicht auflösen, da das Funktionen ist, die aufgerufen werden.

Nicht unbedingt. Hinter Count steckt die interne Variable FCount, und hinter Strings steckt FList - beide sind, obwohl "private", für den Debugger zugänglich und können in einem "Überwachen/Ändern"- oder "Watch"-Fenster angezeigt werden.

Also: "Überwachen/Ändern" öffen, nach Halt an einem Breakpoint, "StrLines" eintippen, etwas nach unten scrollen zu "FCount" - da steht die Zahl der Listeneinträge. "StrLines.FList[0]" eintippen, und schon hat man den 1. Listeneintrag. Schwieriger wirds bei allgemeinen Listen (TList, TFPList etc), da muss man wüste Typumwandlungen probieren, bis man etwas Sinnvolles erhält.

Der Trick liegt in dem vorangestellten F!

Das Verfahren geht natürlich nicht, wenn - wie von Komoluna schon erwähnt - hinter den Properties Funktionen stehen, aber da zeigt Delphi auch nichts an.

Trotzdem, der Debugger ist natürlich bei Delphi wesentlich komfortabler.

Bitschubser hat geschrieben:Die Schwierigkeiten des Debuggers mit records ... in Watch-Ausdrücken...

Mit Records auch? Kann ich nicht bestätigen. Was mich eher stört, ist dass man kein ",h" anhängen kann, um einen Wert als Hexzahl angezeigt zu bekommen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Debugger - Infos

Beitrag von m.fuchs »

wp_xyz hat geschrieben:[...]Was mich eher stört, ist dass man kein ",h" anhängen kann, um einen Wert als Hexzahl angezeigt zu bekommen.

Meinst du sowas:

Bild

Kann man eigentlich ganz leicht einstellen:

Bild
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Debugger - Infos

Beitrag von wp_xyz »

Nein, ich arbeite meisten mit dem "Evaluate/Modify"-Fenster, weil da all die internen Variablennamen angezeigt werden. Wenn ich, wie in dem angehängten Screenshot, die aktuelle Farbe des Canvas-Brush abfragen möchte, wäre es gut, die Farben nicht nur als Dezimalzahl, sondern optional auch als Hexzahl angezeigt zu bekommen. Bei Delphi kann man hierzu ein ",h" an den Abfrageausdruck anhängen, Lazarus sagt aber zu "stringgrid1.fcanvas.flazbrush.fcolor,h" nur "<Error>"
Dateianhänge
debugger.png

Antworten