Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Speicherlecks finden (https://www.delphipraxis.net/53851-speicherlecks-finden.html)

glkgereon 23. Sep 2005 18:09


Speicherlecks finden
 
Hi

gibt es ein Tool mit dem ich meine anwendungen auf Speicherlecks prüfen kann?
möglichst freeware und mit link ;)

Khabarakh 23. Sep 2005 18:12

Re: Speicherlecks finden
 
Was genau meinst du mit Tool? Bei Google suchenMemCheck ist eine einzelne Unit, kann ich empfehlen.

glkgereon 23. Sep 2005 18:44

Re: Speicherlecks finden
 
hmm, sieht ja gar net schlecht aus...

wie muss ich die genau benutzen? (Ich versuch grad das tutorial zu vereinfachen)

also einfach in die dpr MemChk; und fertig?

himitsu 23. Sep 2005 18:49

Re: Speicherlecks finden
 
Oder du verwendest einen der netten SpeicherManager ... FastMem hat ja auch 'nen eingebauten MemoryCheck (dieser muß nur aktiviert werden)

Mein eigener MemoryManager (FastXMem) hat auch einen (dieser wird immer beim Programmende durchgeführt) und man kann sich auch die betrefenden SpeicherBlöcke abspeichern lassen (zum reingucken).
(ich weiß aber im moment nicht, ob der MemoryCheck auch schon die der aktuell Hochgeladenen Version schon drin ist)

glkgereon 23. Sep 2005 18:51

Re: Speicherlecks finden
 
wär mir glaub ich lieber....diese unit ist mir etwas suspekt...

wenn ich einfach am anfang die unit einbinde und MemChk aufrufe hagelt es Exceptions.
wenn ich mir dann diese Textdatei angucke sehe ich folgendes:

Code:
MemCheck version 2.73

Total leak: 968 bytes


*** MEMCHK: Blocks STILL allocated ***

Leak #0 User allocated memory (GetMem)
   Size: 104
   1 Occurence
   call stack - 0 : (no debug info) Find error: 0012EFC8
   call stack - 1 : (no debug info) Find error: 0040D01D
   call stack - 2 : (no debug info) Find error: 0040D52C
   call stack - 3 : (no debug info) Find error: 0040D623
   call stack - 4 : (no debug info) Find error: 0040478E
   call stack - 5 : (no debug info) Find error: 77896C3E
   call stack - 6 : (no debug info) Find error: 7789FF6A
   call stack - 7 : (no debug info) Find error: 0041C97D
   call stack - 8 : (no debug info) Find error: 0041CC2E
   call stack - 9 : (no debug info) Find error: 0041CB9C
   call stack - 10 : (no debug info) Find error: 0041F0A2
   call stack - 11 : (no debug info) Find error: 0041CA12
   call stack - 12 : (no debug info) Find error: 0041CC2E
   call stack - 13 : (no debug info) Find error: 0041CB6D
   call stack - 14 : (no debug info) Find error: 0041F0A2
   call stack - 15 : (no debug info) Find error: 0045D2DE
   call stack - 16 : (no debug info) Find error: 0041D9D3
   call stack - 17 : (no debug info) Find error: 0041AFA3
   call stack - 18 : (no debug info) Find error: 004185F0
   call stack - 19 : (no debug info) Find error: 0041877A
   call stack - 20 : (no debug info) Find error: 0041880B
   call stack - 21 : (no debug info) Find error: 0045CBFE
   call stack - 22 : (no debug info) Find error: 0046515C
   call stack - 23 : (no debug info) Find error: 004BAC59
   call stack - 24 : (no debug info) Find error: 77E98939
   call stack - 25 : (no debug info) Find error: FFFFFFFC

Leak #1 User allocated memory (GetMem)
   Size: 16
   1 Occurence
   call stack - 0 : (no debug info) Find error: 0012F014
   call stack - 1 : (no debug info) Find error: 0040D623
   call stack - 2 : (no debug info) Find error: 0040478E
   call stack - 3 : (no debug info) Find error: 77896C3E
   call stack - 4 : (no debug info) Find error: 7789FF6A
   call stack - 5 : (no debug info) Find error: 0041C97D
   call stack - 6 : (no debug info) Find error: 0041CC2E
   call stack - 7 : (no debug info) Find error: 0041CB9C
   call stack - 8 : (no debug info) Find error: 0041F0A2
   call stack - 9 : (no debug info) Find error: 0041CA12
   call stack - 10 : (no debug info) Find error: 0041CC2E
   call stack - 11 : (no debug info) Find error: 0041CB6D
   call stack - 12 : (no debug info) Find error: 0041F0A2
   call stack - 13 : (no debug info) Find error: 0045D2DE
   call stack - 14 : (no debug info) Find error: 0041D9D3
   call stack - 15 : (no debug info) Find error: 0041AFA3
   call stack - 16 : (no debug info) Find error: 004185F0
   call stack - 17 : (no debug info) Find error: 0041877A
   call stack - 18 : (no debug info) Find error: 0041880B
   call stack - 19 : (no debug info) Find error: 0045CBFE
   call stack - 20 : (no debug info) Find error: 0046515C
   call stack - 21 : (no debug info) Find error: 004BAC59
   call stack - 22 : (no debug info) Find error: 77E98939
   call stack - 23 : (no debug info) Find error: FFFFFFFC

Leak #2 User allocated memory (GetMem)
   Size: 848
   1 Occurence
   call stack - 0 : (no debug info) Find error: 0012FA78
   call stack - 1 : (no debug info) Find error: 0041CC2E
   call stack - 2 : (no debug info) Find error: 0041CB9C
   call stack - 3 : (no debug info) Find error: 0041F0A2
   call stack - 4 : (no debug info) Find error: 0041CA12
   call stack - 5 : (no debug info) Find error: 0041CC2E
   call stack - 6 : (no debug info) Find error: 0041CB6D
   call stack - 7 : (no debug info) Find error: 0041F0A2
   call stack - 8 : (no debug info) Find error: 0045D2DE
   call stack - 9 : (no debug info) Find error: 0041D9D3
   call stack - 10 : (no debug info) Find error: 0041AFA3
   call stack - 11 : (no debug info) Find error: 004185F0
   call stack - 12 : (no debug info) Find error: 0041877A
   call stack - 13 : (no debug info) Find error: 0041880B
   call stack - 14 : (no debug info) Find error: 0045CBFE
   call stack - 15 : (no debug info) Find error: 0046515C
   call stack - 16 : (no debug info) Find error: 004BAC59
   call stack - 17 : (no debug info) Find error: 77E98939
   call stack - 18 : (no debug info) Find error: FFFFFFFC

*** MEMCHK: End of allocated blocks ***


*** MEMCHK: Chronological leak information ***

* User allocated memory (GetMem) (Leak #2) Size: 848
* User allocated memory (GetMem) (Leak #1) Size: 16
* User allocated memory (GetMem) (Leak #0) Size: 104

*** MEMCHK: End of chronological leak information ***


*** MEMCHK: Blocks written to after destruction ***

   Bad blocks count: 0


*** MEMCHK: End of blocks written to after destruction ***
wobei im OnCreate doch nur
Delphi-Quellcode:
  Gruppen:=TStringList.Create;
  Lieder:=TStringList.Create;
  GroupID:=TStringList.Create;
  SetLength(Nodes,0);
gemacht wird...wo soll da ein MemoryLeak sein???

himitsu 23. Sep 2005 18:59

Re: Speicherlecks finden
 
Wenn der MemoryCheck nicht drin ist ... dann werd ich ihn nächte Woche dir mal nachreichen ... i komm ja im Moment nicht ran :(

glkgereon 23. Sep 2005 19:00

Re: Speicherlecks finden
 
Ich find ehrlich gesagt nicht mal das programm überhaupt :duck:

also FastXMem findet nix :(

Dax 23. Sep 2005 19:28

Re: Speicherlecks finden
 
Hast du die Unit am Anfang deiner eigenen Unit oder am Anfang der .dpr eingebunden und als allererstes MemChk; aufgerufen?

glkgereon 23. Sep 2005 19:34

Re: Speicherlecks finden
 
Zitat:

Zitat von Dax
Hast du die Unit am Anfang deiner eigenen Unit oder am Anfang der .dpr eingebunden und als allererstes MemChk; aufgerufen?

Ja

Bernhard Geyer 23. Sep 2005 21:22

Re: Speicherlecks finden
 
Sind auch die Compileroptione passend (Keine Optimierung)

Ich bin aber vor kurzen auf FastMM umgestiegen.
Damit hast du einen schnelleren Memory-Manger ohne Speicherfragmentierung sowie einen MemChecker in einem.
Und zugriff auf freigegebene Sepicherbereiche werden sofort bestraft da die freigegebenen Bereich mit einem Bestimmten Bitmuster belegt werden.

omata 23. Sep 2005 21:34

Re: Speicherlecks finden
 
Ich kann MemProof sehr empfehlen, das Programm zeigt dir sogar die Programmzeile, die das Speicherleck erzeugt.

MfG
Thorsten

Christian Seehase 23. Sep 2005 21:40

Re: Speicherlecks finden
 
Moin Gereon,

Du solltest bei den Optionen vor allem auch die Debug-Informationen einschalten, das scheint bei Dir nämlich nicht der Fall zu sein:

Code:
call stack - 0 : ([b]no debug info[/b]) Find error: 0012EFC8

himitsu 24. Sep 2005 11:17

Re: Speicherlecks finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, tut mir leid ... ist mir dann auch noch eingefallen ... dat muß FastMM heißen (Fast Memory Manager) ... weiß auch nicht, was mich da geritten hatte und meines versteckt sich hier in der DP unter dem Namen FastXMM -.-''



Hier ist auf jeden Fall eine Version mit MemoryCheck (ist zwar nicht die aller neuste Version, aber es sollte ausreichen).

Einfach die FastXMM.pas als erste Unit in deiner DPR eintragen ... und wenn du das Programm beendest, dann kommt die Fehlermeldung ... dort dann noch auf "Ja" klicken und es erscheinen in deinem Programmverzeichnis die Dateien.
Je Speicherblock eine ... die Startadresse des Blocks stecht im Dateinamen und der Speicherinhalt versteckt sich in der Datei.

Und in der Demo, welche sich nicht in dem Verzeichnis mit der FastXMM.pas befindte, kannst du dir auch mal ein SpeicherLeck erstellen lassen und gucken, ob die das überhaupt reicht.
(in die .DAT-Dateien kannst du ja mit einem HEX-Editor, oder notfalls och mit 'nem normalem TextEditor reinschauen)




!!! Es sei aber auf ein Problem mit INDY hingewiesen (falls du etwas davon mit im Programm hast) ... in einer der Hauptdateien des INDY-Projekts wird ein Objekt erstellt, aber "absichtlich" nicht wieder freigegeben ... dort hat man also immer ein SpeicherLeck.
Im Moment hab ich einen entsprechenden Patch noch nicht integriert, der das von INDY "gewollte" SpeicherLeck nicht anzeigt.



Wobei ich zugeben muß, daß wenn MemProf wirklich die "richtige" Zeile anzeigt, daß das dann auch nicht zuverachten ist :cyclops:

[edit=alcaeus]"JEDI" durch "INDY" auf Wunsch von himitsu ersetzt. Mfg, alcaeus[/edit]

glkgereon 24. Sep 2005 13:41

Re: Speicherlecks finden
 
MemProof sieht ganz gut aus....

aber wo sieht man da die zeile?
das is doch nur zum analysieren von Exe's...oder?


und was heissen da die zeilen?
Bytes? O_O
dann hätte ich nen Leak von über 500 kb :pale:

Christian Seehase 24. Sep 2005 13:59

Re: Speicherlecks finden
 
Moin Gereon,

wie sieht es denn mit den Compilereinstellungen aus?
Normalerweise müsste Dir MemProof auf Doppelclick auf ein angezeigtes Problem die Zeile anzeigen.

glkgereon 24. Sep 2005 14:10

Re: Speicherlecks finden
 
hmm, also wenn ich memproof starte kommt erstmal ne leere liste.
wenn ich dann damit ne anwendung starte stehen in der liste die anzahl der pointer, memory, etc. drin.

wenn ich das programm wieder beende komm ich in die "Ressource Details".

aber da steht nix von zeilennummern...wie auch? :?:

Khabarakh 24. Sep 2005 15:03

Re: Speicherlecks finden
 
Falls das nicht klar ist: MemCheck zeigt auch die Zeilen an. Es generiert dazu Exceptions, die dann auf die Zeile weisen.

Christian Seehase 24. Sep 2005 15:16

Re: Speicherlecks finden
 
Moin Gereon,

um Sebastians Aussage noch zu vervollständigen:
Das setzt dann aber auch eine entsprechende Einstellung der Compileroptionen voraus.

alzaimar 24. Sep 2005 15:22

Re: Speicherlecks finden
 
In Memproof must du
1. Suchpfade angeben
2. mit stackframes, ohne Optimierung compilieren
3. mit debuginfo compilieren

omata 24. Sep 2005 20:27

Re: Speicherlecks finden
 
Also bitte nicht so kompliziert!

Das geht alles ganz einfach.
Man kann MemProof direkt über die IDE starten und alles wird auf das aktuelle Projekt eingestellt.
Über Tools->Tools konfigurieren kann man über Hinzufügen ein neues Tool einrichten.
Dort dann den Pfad zu MemProof angeben und als Parameter $EXENAME $PARAMS wählen. fertig.

Wenn man nur mal kurz einen Test machen will, ohne nähere Informationen über den Quellcode zubekommen, startet man einfach.

Für mehr Informationen muss man in Projekt->Optionen->Linker->Mit TD32Debug-Info einschalten und über Projekt->Projekt erzeugen alles neucompilieren und dann wieder über Tools MemProof starten. Dann wird auch der Quellcode eingeblendet.

Einfacher geht es nun wirklich nicht.
Zusätzlich zeigt MemProof auch offene Handles an oder auch harte Fehler. Es werden die Peaks der benutzen Recourcen angezeigt. Und noch vieles mehr...
MemProof zeigt auch, welche Dlls geladen wurden
(ich weiss nicht ob das auch die anderen erwähnten Tools können)

MfG
Thorsten

Peter Wolf 8. Dez 2005 11:46

Re: Speicherlecks finden
 
Hallo,

also bei mir, Delphi7 und WinXP (1800 MHz mit 1 GB RAM), dauert es ca. 1 Minute bis MemProof gestartet ist.
Ist das normal?

Grüße Peter

omata 8. Dez 2005 19:39

Re: Speicherlecks finden
 
Also bei mir (3GHZ mit 512MB RAM) dauert das 1 Sekunde.

Keine Ahnung warum das bei dir solange dauert.

MfG
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz