Memory Leaks finden

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Memory Leaks finden

Beitrag von hy »

Hi, gibt es andere Moeglichkeiten MemoryLeaks zu finden als heaptrc?
Mit heaptrc erhalte ich endlos viel output wie:

Code: Alles auswählen

 
Call trace for block $00007F0AFA524140 size 48
  $00000000006002D7
  $000000000046F99F
  $00000000004829FA
  $0000000000503919
  $0000000000446AB9
  $0000000000482D70
  $0000000000432F76
  $000000000041E11D
Call trace for block $00007F0AFA5156E0 size 56
  $000000000060029B
  $000000000046F99F
  $00000000004829FA
  $0000000000503919
  $0000000000446AB9
  $0000000000482D70
  $0000000000432F76
  $000000000041E11D
Call trace for block $00007F0AFA515600 size 56
  $0000000000600253
  $000000000046F99F
  $00000000004829FA
  $0000000000503919
  $0000000000446AB9
  $0000000000482D70
  $0000000000432F76
  $000000000041E11D
Call trace for block $00007F0AFA50D7C0 size 88
  $00000000004829FA
  $0000000000503919
  $0000000000446AB9
  $0000000000482D70
  $0000000000432F76
  $000000000041E11D
 
 
und das Programm stoppt dann bevor es richtig gestartet ist.
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

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

Re: Memory Leaks finden

Beitrag von theo »

hy hat geschrieben: und das Programm stoppt dann bevor es richtig gestartet ist.
Wenn das so ist, ist der Memory Leak vllt. nicht dein größtes Problem? :wink:

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Leaks finden

Beitrag von laz847 »

Da ich mich auch gerade mit heaptrc rumärgere, kann ich Dir dabei evtl. etwas helfen.
und das Programm stoppt dann bevor es richtig gestartet ist
Der heaptrc Output kommt (so kenne ich es) ja eigentlich, wenn Du Dein Programm beendest, von daher solltest Du das nochmal genauer erklären was da passiert.

@ theo, ich habe ein ähnliches Verhalten bemerkt. Wenn ich in meinem Projekt heaptrc in die uses schreibe und starte stürzt es seit 1-2 Tagen sofort ab und es kommt der

heaptrc Output, schalte ich es in den Projekt Einstellungen ein, gehts wie gewohnt.

Habe gerade von der 1.2.4 auf die 1.2.6 gewechselt (leider auch viel verändert) und bin noch am suchen was das jetzt wieder sein soll :evil:

Hast Du es in den Projekteinstellungen aktiviert oder in die uses geschrieben?

Welche Lazarus Version benutzt Du?

Stürzt Dein Programm nur so (beim Start) ab wenn Du heaptrc einbindest?

Läuft Dein Programm normal an wenn Du heaptrc raus hast?

hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Re: Memory Leaks finden

Beitrag von hy »

laz847 hat geschrieben:Da ich mich auch gerade mit heaptrc rumärgere, kann ich Dir dabei evtl. etwas helfen.
und das Programm stoppt dann bevor es richtig gestartet ist
Der heaptrc Output kommt (so kenne ich es) ja eigentlich, wenn Du Dein Programm beendest, von daher solltest Du das nochmal genauer erklären was da passiert.
Das Programm startet und laedt standardmaessig die zuletzt geoeffnete Datei - dabei wird ein Splashscreen mit Fortschrittsbalken angezeigt, der den Ladevorgang anzeigt.

Es handelt sich um ein GIS (Geoinformationssystem) und die Dateien sind ziemlich gross - aber diese Groesse hat bislang noch keine Probleme bereitet, die ich irgendwo haette erkennen koennen.
Nach dem Laden der Daten werden die Daten auf dem Bildschirm angezeigt. Und das passiert eben nicht wenn ich die Option -gh einschalte.
Das Programm endet nachdem der Fortschrittsbalken 100% erreicht hat.
laz847 hat geschrieben:
Hast Du es in den Projekteinstellungen aktiviert oder in die uses geschrieben?
Ich habe beides versucht mit dem exakt gleichen Ergebnis.
laz847 hat geschrieben: Welche Lazarus Version benutzt Du?
1.5 SVN:48526
laz847 hat geschrieben: Stürzt Dein Programm nur so (beim Start) ab wenn Du heaptrc einbindest?
Ja, ansonsten kann ich da stundenlang damit arbeiten. Dateien oeffnen schliessen. Daten exportieren importieren. Also alles was evtl. Mit Speicherfehlern zu tun haben koennte (Speicher allozieren und wieder freigeben) wird eigentlich recht zuverlaessig ausgefuehrt (denke ich), da ich sonst auch an anderen Stellen frueher oder spaeter Probleme haette.
Läuft Dein Programm normal an wenn Du heaptrc raus hast?
Wie gesagt, ohne hepatrc laeuft es problemlos
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Leaks finden

Beitrag von laz847 »

Das Programm endet nachdem der Fortschrittsbalken 100% erreicht hat.
Ups, was macht denn Dein Programm in diesem Moment, also bei 100%, was ist der nächste Schritt?

Mach Dir doch mal ein paar Ausgaben in ein Logfile (oder nutze den Debugger, Breakpoints) um genauer zu sehen wo und und an welcher Stelle es nicht mehr weitergeht.

Weiterhin könntest Du in den Projekteinstellungen Debuginfos + Prüfungen aktivieren, nur um zu sehen ob nicht andere Fehler da mit rein spielen.

Warum sich das aber nur auswirkt wenn Du heaptrc drin hast ist mir schleierhaft, da brauchst Du wohl Hilfe von den Vollprofis hier, hat keiner eine Idee?

Und wonach suchst Du mit heaptrc wenns eigentlich ohne Probleme läuft, steigt der Speicherverbrauch unerwartet an?

hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Re: Memory Leaks finden

Beitrag von hy »

laz847 hat geschrieben:
Das Programm endet nachdem der Fortschrittsbalken 100% erreicht hat.
Ups, was macht denn Dein Programm in diesem Moment, also bei 100%, was ist der nächste Schritt?

Mach Dir doch mal ein paar Ausgaben in ein Logfile (oder nutze den Debugger, Breakpoints) um genauer zu sehen wo und und an welcher Stelle es nicht mehr weitergeht.
Ich habe mal alle Schritte nach dem Laden geloggt und das Programm stuerzt dann beim Aufbau des Bildschrims ab.
Genauer, es werden Koordinaten berechnet des anzuzeigenden Bildschirmausschnitts und ein nur zur Berechnung noetiges Object wird dann wieder freigegeben.
Dabei 'haengt' dann das Programm. Ich kann vor dem Freigeben auf alle Properties des Objects zugreifen - ohne dass es zu einem Crash kommt.
laz847 hat geschrieben: Weiterhin könntest Du in den Projekteinstellungen Debuginfos + Prüfungen aktivieren, nur um zu sehen ob nicht andere Fehler da mit rein spielen.
Ich versuche es noch mal, habe aber schon alles ausprobiert, was mir sinnvoll erschien.
laz847 hat geschrieben: Warum sich das aber nur auswirkt wenn Du heaptrc drin hast ist mir schleierhaft, da brauchst Du wohl Hilfe von den Vollprofis hier, hat keiner eine Idee?
Ja, waere nett. Womit ich noch keine Erfahrung habe sind die Einstellungen fuer den Heap bei den Projektoptionen.
Vielleicht muesste ich da einen entsprechenden Wert eingeben, damit der Debugger dann noch genug Speicher allozieren kann. Fragen ueber Fragen.
laz847 hat geschrieben: Und wonach suchst Du mit heaptrc wenns eigentlich ohne Probleme läuft, steigt der Speicherverbrauch unerwartet an?
Naja, ich mache da ziemlich viel mit Pointern und dynamischen Listen und wollte eigentlich nur sichergehen, dass das Programm unter Lazarus/Linux genau so sauber laeuft wie unter Delphi/Win. Bislang habe ich mit Lazarus nur kleinere Testprojekte fuer meine eigenen Libraries gemacht und ein grosses Program (eben jenes) von Delphi nach Lazarus portiert.
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Memory Leaks finden

Beitrag von mse »

hy hat geschrieben: Naja, ich mache da ziemlich viel mit Pointern und dynamischen Listen und wollte eigentlich nur sichergehen, dass das Programm unter Lazarus/Linux genau so sauber laeuft wie unter Delphi/Win. Bislang habe ich mit Lazarus nur kleinere Testprojekte fuer meine eigenen Libraries gemacht und ein grosses Program (eben jenes) von Delphi nach Lazarus portiert.
Heaptrace füllt freigegebenen Speicher mit Müll und überprüft laufend die internen heap-Verwaltungsstrukturen. Wenn ein Programm mit heaptrace nicht läuft, ohne aber scheinbar schon, dann liegt die Vermutung nahe, dass Programmierfehler vorhanden sind, welche lediglich nicht immer zu Fehlverhalten führen.
Gibt es eine Fehlermeldung beim Absturz?

hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Re: Memory Leaks finden

Beitrag von hy »

mse hat geschrieben: Heaptrace füllt freigegebenen Speicher mit Müll und überprüft laufend die internen heap-Verwaltungsstrukturen. Wenn ein Programm mit heaptrace nicht läuft, ohne aber scheinbar schon, dann liegt die Vermutung nahe, dass Programmierfehler vorhanden sind, welche lediglich nicht immer zu Fehlverhalten führen.
Gibt es eine Fehlermeldung beim Absturz?
Nein, es stuerzt erstaunlicherweise auch nicht ab. Es beendet sich und es werden auch danach alle Deinitialisierungsfunktionen abgearbeitet - im Log ist das Ende des Programms normal. Alle Ausgaben in die Logdatei, die ich nach dem Freigeben des fraglichen Objektes mache, fehlen. Aber das Ende des Programms wird regulaer geloggt.

Code: Alles auswählen

 
--------------------------------------------------------------------------------
/media/work/src/yMap/bin/ : yMap
Program started  at: 31/03/2015 10:24:23
working in: /media/work/src/yMap/bin
Opening frm MRU
Work-Mode: 0
colly created
_gpsCol loaded /media/work/hy/yMap/lanzarote_2015_03.gps
_gpsCol synced: 0
_gpsCol loaded starting draw
forceInitParams: Start Draw
DrawMap: Start Draw
_draw: Start Draw
_draw: qInit
qInitDrawing: 0
qInitDrawing: 1
qInitDrawing: 2
qInitDrawing: 2 defaultInit
defaultInit: SenderContext: -1
CENTER WP 1 start
TargetWP1xy start
TargetWP1xy [#143807] - N29°10.566 W013°29.627 - Taro -  - to search - 392m - Track in town sight historic site [Q: exact]
TargetWP1xy [#-2] - N28°48.838 W013°33.921 -  -  -  - ~m - Track - undefined  [Q:N/A]
TargetWP start to free [#-2] - N28°48.838 W013°33.921 -  -  -  - ~m - Track - undefined  [Q:N/A]
TargetWP b4 free 0 - connections
###
/media/work/src/yMap/bin/ : yMap
Programm stopped at: 31/03/2015 10:24:34
Time alive:    00 days 00 hours 00 minutes 10 Seconds 35 (h)  
--------------------------------------------------------------------------------
 
 
The line containing ### should also be followed by logs stating the exit of all procedures mentioned above
like:
CENTER stop
default init end
qInit 3 stop
_draw stop
DrawMap stop draw
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Memory Leaks finden

Beitrag von mse »

Wie ist der exitcode?

hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Re: Memory Leaks finden

Beitrag von hy »

mse hat geschrieben:Wie ist der exitcode?
Der exitcode ist 1
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Memory Leaks finden

Beitrag von mse »

hy hat geschrieben:
mse hat geschrieben:Wie ist der exitcode?
Der exitcode ist 1
Vermutlich von Heaptrace gesetzt. Kompiliere die RTL mit debuginfo und setze in "rtl/inc/heaptrc.pp" in allen Zeilen wo "halt(1)" vorkommt einen breakpoint. Das Programm stoppt dann sobald ein Fehler festgestellt wird.

hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Re: Memory Leaks finden

Beitrag von hy »

Hallo, ich habe den Fehler gefunden. Ich hatte einen Pointer der bereits alloziert war := NIL gesetzt und dann noch einmal initialisiert.
Problem scheint damit wohl aber noch nicht ganz behoben, da noch ein anderer Fehler auftritt. Aber der ist auch bereits eingegrenzt.
(Naja 100.000 Zeilen Quellcode sind dann eben nicht so schnell gecheckt).
Erst mal Danke fuers helfen.
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

hy
Beiträge: 9
Registriert: Sa 4. Nov 2006, 16:04

Re: Memory Leaks finden

Beitrag von hy »

Hmmm, was sagen mir die ersten beiden Zeilen. Wo muss ich suchen, damit ich weiss, was das Problem ist?

Code: Alles auswählen

 
 
(ylibtest:1822): GLib-CRITICAL **: Source ID 216 was not found when attempting to remove it
 
(ylibtest:1822): GLib-CRITICAL **: Source ID 215 was not found when attempting to remove it
Heap dump by heaptrc unit
43442 memory blocks allocated : 4119946/4203240
43442 memory blocks freed     : 4119946/4203240
0 unfreed memory blocks : 0
True heap size : 688128
True free heap : 688128
 
 
Danke fuer jede Hilfe
OS: Debian/sid(64) fpc2.6.4 Lazarus: SVN

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

Re: Memory Leaks finden

Beitrag von theo »

Das ist was in GLib (GTK). Muss nicht an deinem Code liegen. Wahrscheinlich harmlos.
Siehe z.B. http://stackoverflow.com/questions/2319 ... -remove-it

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
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: Memory Leaks finden

Beitrag von m.fuchs »

Das hat nichts mit Heaptrc oder deinem Programm zu tun.

Schau mal hier: http://stackoverflow.com/questions/2319 ... -remove-it
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten