Fehlermeldungen in der Console nach Beenden
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Fehlermeldungen in der Console nach Beenden
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.
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
- 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
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:
Nun kannst Du Dir in Ruhe den trace.txt ansehen.
Winni
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
Winni
-
- Lazarusforum e. V.
- Beiträge: 3178
- 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
Falls es noch weitere Ausgaben auf StdErr gibt, kann man Heaptrc auch explizit in eine bestimmte Datei schreiben lassen:
Quelle: https://wiki.freepascal.org/heaptrc
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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- 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
Hi!
Und wenn alle Fehler beseitigt sind, soll das etwa so aussehen:
Winni
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
Re: Fehlermeldungen in der Console nach Beenden
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:
Weiß da jemand Genaueres?
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;
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1645
- 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
Vielleicht wenn es eine Consolenanwendung ist?
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Fehlermeldungen in der Console nach Beenden
Es ist eine normale "Applikation".
Vielen Dank für die Hinweise, ich untersuche es nun mal.
Vielen Dank für die Hinweise, ich untersuche es nun mal.
EleLa - Elektronik Lagerverwaltung - www.elela.de
- af0815
- Lazarusforum e. V.
- Beiträge: 6776
- 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
Theo, du hast dein Objekt aber nicht an eine visuelle Komponente gebunden die aus dem GTK stammt.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:Weiß da jemand Genaueres?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;
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).
Re: Fehlermeldungen in der Console nach Beenden
Kannst du mal ein Beispiel machen, wie ich so eine Meldung unter Linux/GTK2 provozieren kann?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.
Ich schaff's nicht.
- af0815
- Lazarusforum e. V.
- Beiträge: 6776
- 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
Null Problemo, du bist zuwenig kreativ Theo

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;
Lazarus 2.0.11 r63594M FPC 3.2.1 x86_64-linux-gtk2ndi@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
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Fehlermeldungen in der Console nach Beenden
Jaa, gut, mit Gewalt geht's.

Danke!
- af0815
- Lazarusforum e. V.
- Beiträge: 6776
- 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
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).
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Fehlermeldungen in der Console nach Beenden
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 ...
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:
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
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;
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6776
- 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
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.
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).
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Fehlermeldungen in der Console nach Beenden
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: Nur stand im Trace 57666 statt 57665, hätte ich dennoch selbst sehen können.
Nun ist das Trace tatsächlich um 15KB kleiner geworden:
in 57665 ist ein Create, der Free hatte in 57672 noch gefehlt: Nur stand im Trace 57666 statt 57665, hätte ich dennoch selbst sehen können.

Nun ist das Trace tatsächlich um 15KB kleiner geworden:
EleLa - Elektronik Lagerverwaltung - www.elela.de