Hallo,
mein Programm beinhaltet einen Webserver, der mit Threads arbeitet. Das Programm funktioniert wie es soll, wenn es ein paar Stunden läuft. Nach einer längeren Zeit reagiert es allerdings nicht mehr. Irgendetwas scheint "vollzulaufen". Habt ihr eine Idee wie man so eine "undichte Stelle" am besten findet? (Und jetzt schreibe bitte keiner "unters Wasser halten")
Viele Grüße
leosok
Speicherleck finden
- 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: Speicherleck finden
Gegen Speicherlecks hilft HeapTrc. Kurze Anleitung unter http://lazarus-ccr.sourceforge.net/docs ... usage.html
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: Speicherleck finden
Da das Programm als Server laueft, ist es vielleicht besser, einen kleinen (oder großen) stand-alone Test zu schreiben. Der kann dann typische http Requisits simulieren.
Allerdings, kann es sein das heaptrc nix findet. Wenn z.B. Objecte erzeugt werden, die erst am ende des Programms freigegeben werden (explizit vom Programm freigegeben, der Rest wird immer vom OS freigegeben). Heaptrc testet bei Programm ende.Und da die Freigabe dann im test (der ja endet) passiert, ist alles ok. Aber der Server laueft ja laenger, und all diese Objekte sammeln sich....
Eventuell ein logfile, und dann im Constructor/Destructor, ein Counter (globale variablen) per Klasse. Dann kannst du beobachten ob irgendeine Klasse unerwartet zunimmt.
Allerdings, kann es sein das heaptrc nix findet. Wenn z.B. Objecte erzeugt werden, die erst am ende des Programms freigegeben werden (explizit vom Programm freigegeben, der Rest wird immer vom OS freigegeben). Heaptrc testet bei Programm ende.Und da die Freigabe dann im test (der ja endet) passiert, ist alles ok. Aber der Server laueft ja laenger, und all diese Objekte sammeln sich....
Eventuell ein logfile, und dann im Constructor/Destructor, ein Counter (globale variablen) per Klasse. Dann kannst du beobachten ob irgendeine Klasse unerwartet zunimmt.
- 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: Speicherleck finden
Deswegen würde ich lieber ein Testsystem aufsetzen, wo wirklich eine Instanz des Servers läuft. Zwischendurch kann man mit DumpHeap auch schon mal eine Ausgabe von HeapTrc erzwingen. Ist dann zwar nicht besonders schön (weil alle laufenden Heap-Belegungen darin auftauchen), aber vielleicht hilft das ja.martin_frb hat geschrieben:Allerdings, kann es sein das heaptrc nix findet. Wenn z.B. Objecte erzeugt werden, die erst am ende des Programms freigegeben werden (explizit vom Programm freigegeben, der Rest wird immer vom OS freigegeben). Heaptrc testet bei Programm ende.Und da die Freigabe dann im test (der ja endet) passiert, ist alles ok. Aber der Server laueft ja laenger, und all diese Objekte sammeln sich....
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Speicherleck finden
Vielen Dank. Das gibt mir erst mal eine Richtung!
Grüße
Grüße