Fehlermeldungen in der Console nach Beenden

Für Fragen von Einsteigern und Programmieranfängern...
MmVisual
Beiträge: 1469
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Fehlermeldungen in der Console nach Beenden

Beitrag von MmVisual »

Hallo,

Nach dem Beenden der EXE kommt unter Linux in der Console einige Fehlermeldungen dass was nicht korrekt frei gegeben wurde. Mein Problem ist dass der Quellcode extrem umfangreich ist und ich nicht weiß wie ich anfangen zu suchen soll.
Normalerweise entwickle ich unter Windows, da sieht man nichts. Und das letzte halbe Jahr wurde sehr viel im Code geändert, z.B. ein TDataModule neu mit eingebunden. Soweit ich das überprüft habe wird alles wieder korrekt mit Free gelöscht, was ich selbst erstellt hatte, bin mir jedoch nicht sicher ob ich nicht doch noch was vergessen habe.

Das steht in der Console:

[TGtk2WidgetSet.Destroy]WARNUNG: Es gibt 1 nicht freigegebene DCs. Es folgt ein detaillierter Dump:
[TGtk2WidgetSet.Destroy] DCs: 00007FFFF3481640
[TGtk2WidgetSet.Destroy]WARNUNG: Es gibt 2 nicht freigegebene GDI-Objekte. Es folgt ein detaillierter Dump:
[TGtk2WidgetSet.Destroy] GDIOs: 00007FFFF34EFC40 00007FFFF34EFDC0
[TGtk2WidgetSet.Destroy] gdiBitmap: 2

Kann mir jemand einen Tipp geben wie ich anhand der Adressen zum Objekt im Speicher komme?
Oder gibt es eine Möglichkeit dass zusätzlich der Objektname mit ausgegeben wird?

Vielen Dank für die Hilfe.

Viele Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von Winni »

Hi!

Projekt --> Projekteinstellungen --> Debuggen

Hier aktivieren
a) Zeilennummern anzeigen
b) Heaptrc-Unit verwenden

Jetzt kommt nach dem Beenden Deines Programms eine Liste von nicht freigegeben Resourcen mit Zeilennummern.

Wenn das zuviel ist kann man das auch in eine Datei umleiten:

Code: Alles auswählen


./MeinProgram 2> trace.txt
Nun kannst Du Dir in Ruhe den trace.txt ansehen.

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von Socke »

Falls es noch weitere Ausgaben auf StdErr gibt, kann man Heaptrc auch explizit in eine bestimmte Datei schreiben lassen:

Code: Alles auswählen

program prog1;

begin
// funktioniert nur im Hauptprogramm
{$if declared(useHeapTrace)}
  setHeapTraceOutput('trace.log'); // supported as of debugger version 3.2.0
{$endIf}
end.
Quelle: https://wiki.freepascal.org/heaptrc
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von Winni »

Hi!

Und wenn alle Fehler beseitigt sind, soll das etwa so aussehen:

Code: Alles auswählen

Heap dump by heaptrc unit
4558639 memory blocks allocated : 677332169/682153208
4558639 memory blocks freed     : 677332169/682153208
0 unfreed memory blocks : 0
True heap size : 1605632
True free heap : 1605632

Winni

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von theo »

Es ist sicher richtig, hier mal mit Heaptrace nachzuschauen, aber ich frage mich gerade, in welchen Fällen auf der Konsole überhaupt so etwas "unaufgefordert" ausgespuckt wird.

Handelt es sich hierbei nicht um tiefere Probleme, entweder in der LCL- oder in der GTK-Version?

Wenn ich so etwas mache und nichts freigebe, erhalte ich jedenfalls keine Meldung:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var Img:Timage;
begin
     Img:=Timage.Create(nil);
     Img.Picture.LoadFromFile('/home/theo/test.jpg');
end;    
Weiß da jemand Genaueres?

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

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von fliegermichl »

Vielleicht wenn es eine Consolenanwendung ist?

MmVisual
Beiträge: 1469
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von MmVisual »

Es ist eine normale "Applikation".

Vielen Dank für die Hinweise, ich untersuche es nun mal.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6212
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: Fehlermeldungen in der Console nach Beenden

Beitrag von af0815 »

theo hat geschrieben:
Mo 24. Aug 2020, 12:32
Handelt es sich hierbei nicht um tiefere Probleme, entweder in der LCL- oder in der GTK-Version?

Wenn ich so etwas mache und nichts freigebe, erhalte ich jedenfalls keine Meldung:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var Img:Timage;
begin
     Img:=Timage.Create(nil);
     Img.Picture.LoadFromFile('/home/theo/test.jpg');
end;    
Weiß da jemand Genaueres?
Theo, du hast dein Objekt aber nicht an eine visuelle Komponente gebunden die aus dem GTK stammt.

Ich bekomme gtk Fehler öfters, wenn ich dynamisch visuelle Objekte erzeuge, die nicht an ein Fenster oder Frame gebunden sind bzw. owner = nil) und dann entweder vergesse das Objekt zu zerstören oder den Parent zu früh freigebe.

Unter Windows wird da einiges vom System versteckt (und hat normalerweise ein anderes Widgetset) unter Linux sieht man es auf der Konsole.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von theo »

af0815 hat geschrieben:
Mo 24. Aug 2020, 15:39
Theo, du hast dein Objekt aber nicht an eine visuelle Komponente gebunden die aus dem GTK stammt.
Kannst du mal ein Beispiel machen, wie ich so eine Meldung unter Linux/GTK2 provozieren kann?
Ich schaff's nicht.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6212
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: Fehlermeldungen in der Console nach Beenden

Beitrag von af0815 »

Null Problemo, du bist zuwenig kreativ Theo :D

Code: Alles auswählen

.....
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Image1Paint(Sender: TObject);
  private
    image: TImage;
  public

  end;

........

procedure TForm1.Button1Click(Sender: TObject);
begin
  image := TImage.Create(nil);
  image.Parent:= self;
  image.Picture.LoadFromFile('a.bmp');
  image1.Picture:= image.Picture;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  halt(0);
end;

procedure TForm1.Image1Paint(Sender: TObject);
begin
  halt(0);
end;     
ndi@tosh:~/data/dummy$ ./project1
WARNING: TForm1.Destroy with LCLRefCount>0. Hint: Maybe the component is processing an event?
[TGtk2WidgetSet.Destroy] WARNING: There are 2 unreleased DCs, a detailed dump follows:
[TGtk2WidgetSet.Destroy] DCs: 00007F7773C7B240 00007F7773C7B040
[TGtk2WidgetSet.Destroy] WARNING: There are 3 unreleased GDIObjects, a detailed dump follows:
[TGtk2WidgetSet.Destroy] GDIOs: 00007F7774938040 00007F7774937F40 00007F7774937E40
[TGtk2WidgetSet.Destroy] gdiBitmap: 1
[TGtk2WidgetSet.Destroy] gdiBrush: 1
[TGtk2WidgetSet.Destroy] gdiRegion: 1
Lazarus 2.0.11 r63594M FPC 3.2.1 x86_64-linux-gtk2
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von theo »

af0815 hat geschrieben:
Mo 24. Aug 2020, 21:59
Null Problemo, du bist zuwenig kreativ Theo :D
Jaa, gut, mit Gewalt geht's. :lol:
Danke!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6212
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: Fehlermeldungen in der Console nach Beenden

Beitrag von af0815 »

theo hat geschrieben:
Mo 24. Aug 2020, 23:00
Jaa, gut, mit Gewalt geht's. :lol:
Danke!
Es ist nicht Gewalt, sondern genaugenommen so ein 50.000 Zeilen Programm auf die Essenz verdichtet, wenn man Fehler sucht.

Nachdem ich täglich und beruflich mit FPC/Lazarus arbeite (Windows/Linux mit Crosscompiling nach Arm) habe ich natürlich mit den verschiedensten 'Erscheinungen' und Fehlern zu kämpfen. Teilweise auch mit Bugs in der Implementierung von GTK2. Dort eher auf Plattformen wie Arm, die halt nicht so 100% im Fokus stehen. Deswegen auch gefährliches Halbwissen über manche Sachen in der GTK2 implementierung.

Das Beispiel ist brutal einfach, das halt(0) soll nur Stellvertretend sein, das das Programm für GTK unerwartet beendet wird und nicht alle Ressourcen vorher zurückgegeben werden. Generell habe ich den Fehler gerne in meinen Programmen (gehabt), wenn ich bei der OnCreate des Formulars draufkomme das zB. eine unbedingt notwendige Resource fehlt oder nicht erreichbar ist (Hand-Scanner, SQL-Server,...) und deswegen das Programm mit einer Fehlermeldung für den Benutzer beende. Das ist der häufigste Zeitpunkt wo ich in meiner Praxis die Fehlermeldungen nachvollziehbar und deterministisch gehabt habe. Ansonsten ist die Lebenszeit meiner Objekte sehr genau definiert um Speicherlecks zu vermeiden, da die Applikationen im industriellen Umfeld oft lange am Stück laufen.

LG. Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1469
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von MmVisual »

Bei einem TBitmap hatte ich zum Schluss nur ein .FreeImage und kein .Free, das erzeugte die Fehlermeldung, doch der Stacktrace ist noch etwas größer ...
trace.txt
(18.73 KiB) 58-mal heruntergeladen
Gibt es eine relativ einfache Möglichkeit, das wenn z.B. in einer Funktion ein lokales Objekt angelegt ist und anschließend nicht mehr mit Free frei gegeben wird, dass dann ein Trace erscheint?

Also:

Code: Alles auswählen

Procedure xxx();
Var q: TZQuery;
Begin
  q := TZQuery.Create(Self); // <<< hier ein Create von q
  : :
               // <<< vor dem END; fehlt das q.Free > Trace Log erzeugen
End;
Oder wenn z.B. der FPC feststellt, dass bei Rücksprung der Stack nicht mehr der gleiche ist, dann wurde ja ein Objekt angelegt. Ich weiß jetzt nicht wie es intern der FPC macht.

Bei den Zeilennummern wo mir der Trace ausgibt, bzw. in der Funktion, finde ich nicht das was ich vergessen habe frei zu geben.

Vielen Dank für die Hilfe. Den ganzen Code mit einem Adlerauge zu durchforsten ist doch sehr schwer, daher frage ich lieber nochmal ob es nicht schon ein Werkzeug dafür gibt. (Leider hat die TZQuery kein OnCreate / OnDestroy Event, das ich nutzen könnte)

Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6212
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: Fehlermeldungen in der Console nach Beenden

Beitrag von af0815 »

Was machst du in Zeile 57666 von fMain und Zeile 150 in customtimer ? Da wird scheinbar ein Resultset abgefragt.

Auch mit Breakpoints und dem LazLogger kann man sich helfen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1469
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Fehlermeldungen in der Console nach Beenden

Beitrag von MmVisual »

Vielen Dank! wenn man nochmal drauf hingewiesen wird, dann sieht man es auf einmal selbst!

in 57665 ist ein Create, der Free hatte in 57672 noch gefehlt:
Bild1.png
Bild1.png (8.31 KiB) 2034 mal betrachtet
Nur stand im Trace 57666 statt 57665, hätte ich dennoch selbst sehen können. :oops:

Nun ist das Trace tatsächlich um 15KB kleiner geworden:
trace2.txt
(3.23 KiB) 65-mal heruntergeladen
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten