Feldbefehle für Debugging (a.k.a include-Direktive)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Feldbefehle für Debugging (a.k.a include-Direktive)

Beitrag von Dee »

Moin,

mir kam eine Idee zum Thema Feldbefehle, welche das Debuggen erleichtern könnten.
Es gibt die Möglichkeit in Lazarus im Code TODO-Einträge zu erstellen (siehe hier: https://wiki.lazarus.freepascal.org/IDE ... Do_List/de)

Wie wäre es mit etwas Ähnlichem, das erlaubt, z.B. die aktuelle Code-Zeile auszugeben, in der der Feldbefehl steht und welche Unit gerade verwendet wird?

Hier meine Überlegungen:

mögliche Feldbefehle:
  • CODE_LINE
  • METHOD_NAME
  • UNIT_NAME
Syntax:

Code: Alles auswählen

'Some String <FIELD>'
Beispiele:

Code: Alles auswählen

'Dieser Text findet sich in Zeile <CODE_LINE>';
'Aktuelle Unit ist <UNIT_NAME>';
'Dieser Aufruf findet in der Methode <METHOD_NAME> statt';

Code: Alles auswählen

{122}	// CODE_LINE
{123}	ShowMessage('Dieser Aufruf befindet sich in Zeile <CODE_LINE>');
{124}
{125}	//METHOD_NAME
{126}	ShowMessage('Dieser Aufruf befindet sich in der Methode <METHOD_NAME>');
Zweck:
  • soll das debuggen vereinfachen
Anmerkungen:
  • Kommentar kann vielleicht weggelassen werden und der Parser merkt sich, in welcher Zeile welcher Feldbefehl geschrieben wurde
  • durch Feldbefehle aus LibreOffice inspiriert
Vielleicht könnte man auch die Format-Anweisungen dadurch erweitern.

Beispiel:

Code: Alles auswählen

ShowMessage(Format('Diese Anweisung befindet sich in Zeile %s der Unit %s.', [<CODE_LINE>, <UNIT_NAME>]))
EDIT: Offenbar gibt es genau soetwas. Nämlich die include-Direktive. Mehr dazu hier: https://wiki.lazarus.freepascal.org/$include/de (Danke an m.fuchs für diesen Hinweis)

-- Dee
Zuletzt geändert von Dee am Mi 10. Feb 2021, 02:00, insgesamt 3-mal geändert.

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

Re: Feldbefehle für Debugging

Beitrag von af0815 »

Das mit der Unit und der Name der Routine gibt es tatsächlich bereits im fpc. Ich suche mir morgen den Code dazu heraus. Gehts sehr gut, ich mache damit mein Looging.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Feldbefehle für Debugging

Beitrag von Dee »

Da bin ich gespannt drauf!

-- Dee

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2413
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: Feldbefehle für Debugging

Beitrag von m.fuchs »

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Unit: ' + UnitName + LineEnding +
              'File: ' + {$INCLUDE %FILE%} + LineEnding +
              'Methodname: ' +  {$I %CURRENTROUTINE%} + LineEnding +
              'Linenumber: ' + {$INCLUDE %LINE%});
end; 
Bild
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Feldbefehle für Debugging

Beitrag von Dee »

Wow, ich bin sprachlos. Warum wusste ich nicht schon vorher etwas davon? :shock: Hätte nicht gedacht, dass es soetwas gibt. Ich dachte, man würde das nur über den Debugger erfahren. Wie sähe ein Beispiel aus, in dem man bei einer Exception diese Direktiven benutzt?

-- Dee

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2413
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: Feldbefehle für Debugging (a.k.a inlcude-Direktive)

Beitrag von m.fuchs »

Kann man zum Beispiel so machen:

Code: Alles auswählen

unit Unit1;
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Test1;
    procedure Test2;
    procedure Test3;
    procedure Test4;
  end;

var
  Form1: TForm1;

implementation
{$R *.lfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  l: String;
begin
  try
    l := {$INCLUDE %LINE%}; Self.Test1;
    l := {$INCLUDE %LINE%}; Self.Test2;
    l := {$INCLUDE %LINE%}; Self.Test3;
    l := {$INCLUDE %LINE%}; Self.Test4;
  except
    on e:Exception do
      ShowMessage('Error "' + e.Message + '" in line ' + l);
  end;
end;

procedure TForm1.Test1;
begin
  // do nothing
end;

procedure TForm1.Test2;
begin
  // do nothing
end;

procedure TForm1.Test3;
begin
  raise Exception.Create('I''m sorry Dave, I''m afraid I can''t do that.');
end;

procedure TForm1.Test4;
begin
  // do nothing
end;

end.
Ergibt dann:
Error "I'm sorry Dave, I'm afraid I can't do that." in line 33
Finde ich persönlich aber sehr umständlich.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Feldbefehle für Debugging (a.k.a include-Direktive)

Beitrag von af0815 »

Ich verwende es normalerweise so

Code: Alles auswählen

  FScanner := TLazScanner.Create(nil);
  try
    FScanner.Device:= coComPort;
    FScanner.BaudRate:= br115200;
    FScanner.DataBits:= db8bits;
    FScanner.StopBits:= sbOne;
    FScanner.FlowControl:= fcNone;
    FScanner.Parity:= pNone;
    FScanner.OnRxData:= nil;
    FScanner.OnStatus:= nil;
    FScanner.Open;
  except
    on E: Exception do
       Debugln(DateTimeToStr(now) + ' '+ {$I %FILE%} + '->' +{$I %CURRENTROUTINE%} + ' Exception Scanner start '+ LineEnding
       + 'Message='+E.Message);
  end;
Damit habe ich eine Info wo der Fehler war.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 394
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Feldbefehle für Debugging (a.k.a include-Direktive)

Beitrag von PascalDragon »

Dee hat geschrieben:
Di 9. Feb 2021, 21:42
EDIT: Offenbar gibt es genau soetwas. Nämlich die include-Direktive. Mehr dazu hier: https://wiki.lazarus.freepascal.org/$include/de (Danke an m.fuchs für diesen Hinweis)
Oder, um auf die offizielle Dokumentation zu verweisen, hier. ;)
FPC Compiler Entwickler

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Feldbefehle für Debugging (a.k.a include-Direktive)

Beitrag von Dee »

@PascalDragon Werde in Zukunft drauf achten, die originale Referenz zu verlinken. :)

Erstmal vielen Dank soweit für die ganzen Antworten. Die waren wirklich sehr Hilfreich! :mrgreen:

Dann ist mir aufgefallen, dass der Debugger weiß, welches Objekt zum Beispiel nicht freigegeben wurde, wenn es ein Speicherleck gibt. Wie könnte man das in eine Exception- oder Logging-Meldung einarbeiten? Im Idealfall sollte es nicht nur auf Speicherlecks beschränkt sein.

-- Dee

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

Re: Feldbefehle für Debugging (a.k.a include-Direktive)

Beitrag von af0815 »

Für mich macht das HeapTrace. Das kann man im ProjektInspektor aktivieren und deaktivieren. Dazu gibt es auch eine Wiki https://wiki.lazarus.freepascal.org/heaptrc . Oder meist du etwas anderes ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten