AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Speicherleaks finden mit FastMM4

Ein Thema von Shark99 · begonnen am 11. Jun 2020 · letzter Beitrag vom 17. Jun 2020
Antwort Antwort
Seite 2 von 3     12 3   
Delphi.Narium

Registriert seit: 27. Nov 2017
1.952 Beiträge
 
Delphi 7 Professional
 
#11

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 11:01
Schau mal bitte dort: GitHub: jcl/jcl/experts/stacktraceviewer/APIExamples/FastMM/

Eventuell kannst Du damit was anfangen.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.243 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 11:11
Du kannst Dir evtl. mal EurekaLog anschauen.
Das war m.E. schon komfortabler.

Ist aber für mich eine Weile her und ich weiß nicht, ob es noch eine kostenfreie Emba-Edition gibt.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.240 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 11:24
Schau mal bitte dort: GitHub: jcl/jcl/experts/stacktraceviewer/APIExamples/FastMM/

Eventuell kannst Du damit was anfangen.
Da braucht man wohl die JCL zu. JEDI-Komponenten verwende ich aber nicht (aus Gründen der "Komponentensparsamkeit")...

Aber evtl. gibt es die fertige Exe irgendwo als Download?

Geändert von Harry Stahl (12. Jun 2020 um 11:58 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.952 Beiträge
 
Delphi 7 Professional
 
#14

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 12:10
Und wenn Du Dir die Mühe machst, Dir das mal anzuschauen, wirst Du feststellen, dass das die JCL ist und diese (bekanntermaßen) keine Komponenten enthält und Du daher dafür auch keine Komponenten sparen musst.

Es handelt sich um einen Experten für die IDE. Den musst Du dann schon kompilieren und installieren.

Man könnte sich aber auch einfach mal die Quellen anschauen, um zu sehen, wie die das machen und dann eine eigene Lösung finden. Nur so als Idee

In meinem Log muss ich übrigens nur nach den Zeilen suchen, die mit einer in eckigen Klammern eingefassten Zahl enden.

Sieht z. B. so aus:
Code:
6A8ED2 [e:\Delphi\Indy10\Lib\Core\IdThreadSafe.pas][IdThreadSafe][TIdThreadSafe.Create][253]
Das kann man dann auch per eigenem Programm, Script, ... auswerten.

Hab' mir mal eben für meinen Editor ein PascalScript geschrieben:
Delphi-Quellcode:
program Test;
var
        i : Integer;
        sl : TStringList;
        s : String;
begin
  sl := TStringList.Create;
  sl.LoadFromFile('Programmname_MemoryManager_EventLog.txt');
  for i := sl.Count - 1 downto 0 do begin
    sl[i] := ReverseString(sl[i]);
    if Copy(sl[i],1,1) = ']then begin
      s := Copy(sl[i],2,Length(sl[i]));
      s := Copy(s,1,Pos('[',s) - 1);
      if StrToIntDef(s,-1) <> -1 then sl[i] := ReverseString(sl[i]) else sl.Delete(i);
    end else sl.Delete(i);
  end;
  sl.Sort;
  for i := sl.Count - 1 downto 1 do if sl[i] = sl[i - 1] then sl.Delete(i);
  sl.SaveToFile('Programmname_MemoryManager_EventLog.txt.report');
  sl.Free;
end.
Damit hab' ich dann eine Datei, in der alle Zeilen stehen, die ich mir anschauen muss. Sieht so aus:
Code:
690647 [e:\Delphi\Indy10\Lib\System\IdStack.pas][IdStack][IdStack][1225]
69F22B [e:\Delphi\Indy10\Lib\Core\IdIOHandler.pas][IdIOHandler][TIdIOHandler.SetDefaultClass][910]
69F296 [e:\Delphi\Indy10\Lib\Core\IdIOHandler.pas][IdIOHandler][TIdIOHandler.RegisterIOHandler][953]
6A8EB6 [e:\Delphi\Indy10\Lib\Core\IdThreadSafe.pas][IdThreadSafe][TIdThreadSafe.Create][251]
6A8ED2 [e:\Delphi\Indy10\Lib\Core\IdThreadSafe.pas][IdThreadSafe][TIdThreadSafe.Create][253]
6A9079 [..\..\Indy10\Lib\Core\IdThread.pas][IdThread][IdThread][730]
War ungefähr 10 Minuten Aufwand

Datei analysieren, benötigte Informationen erkennen. Script schreiben, das diese raussucht und speichert.

Mit dem Ergebnis muss man dann auf die Suche gehen. Das kann dann schonmal was länger dauern

PS:

in der FastMM4Options.inc hab' ich
Delphi-Quellcode:
{$define LogMemoryLeakDetailToFile}
{$define EnableMemoryLeakReportingUsesQualifiedClassName}
{$define ClearLogFileOnStartup}
aktiviert.

Musst halt mal schauen, was da für Dich die sinnvollste Ausgabe ist.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.240 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 12:40
@Delphi.Narium

Zu JCL/Jedi: Neben Komponentensparsamkeit gilt für mich auch eine Expertensparsamkeit, außer GExperts verwende ich da nichts (jedenfalls in den aktuellen Delphi-Versionen, in älteren Delphi-Versionen notgedrungen auch CNPack). Sonst nur externe Experten (z.B. Pascal-Analyser).

Zu Deinem Excerpt: Ja prima, damit komme ich zurecht.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#16

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 14:50
hier der Log mit TD32 Debuginfo:
Delphi-Quellcode:
--------------------------------2020/6/12 14:48:24--------------------------------
A memory block has been leaked. The size is: 12

This block was allocated by thread 0x5D2C, and the stack trace (return addresses) at the time was:
402D38 [System][@GetMem]
451AE4 [Unit1.pas][Unit1][TForm1.FormShow][30]
4496D3 [Forms][TCustomForm.DoShow]
44C6A6 [Forms][TCustomForm.CMShowingChanged]
432337 [Controls][TControl.WndProc]
77181031 [RtlCaptureStackBackTrace]
426C41 [MultiMon][InitAnApi]
73B99FCB [SE_GetProcAddressForCaller]
426C41 [MultiMon][InitAnApi]
73B99FE3 [SE_GetProcAddressForCaller]
73B9A00D [SE_GetProcAddressForCaller]

The block is currently used for an object of class: Unknown

The allocation number is: 355

Current memory dump of 256 bytes starting at pointer address 7FE35550:
8C 7C 45 00 80 64 CE CE A6 80 80 80 80 80 80 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Œ | E . € d Î Î ¦ € € € € € € € . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

--------------------------------2020/6/12 14:48:24--------------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

5 - 12 bytes: Unknown x 1

Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting".
Der Stacktrace ist jetzt sehr hilfreich. Den Mem Dump verstehe ich aber immer noch nicht. Wie kommt er drauf die Adresse 7FE35550 für den Mem Dump anzuzeigen?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.240 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 16:45
Na, wenn das so einfach ist, werde ich das noch in meinen Pascal Editor einbauen.

Wenn ein Projekt geladen ist, nur rechts in dem Projektfenster auf das Memory-Symbol klicken. Wenn die EventLog-Datei im Standardverzeichnis liegt, wird sie automatisch geladen, wenn nicht, erhält man eine Aufforderung, den Pfad anzugeben.

Dann wird auf der linken Seite automatisch ein neuer Tab "Leaks" amgezeigt, wo nach Units unterteilt die entsprechenden Prozeduren und Zeilenangaben stehen. Per Doppelklick auf einen Eintrag wird die entsprechende Unit geöffnet (in der Vollversion - in der Testversion muss man es selber machen) und der Cursor in die entsprechende Zeile gestellt.

Siehe anliegenden Screenshot.

Ich wollte heute Abend sowieso eine aktualisierte Version hochladen (muss noch einen kleinen Bug entfernen, wie man sieht werden ein paar Einträge in der Liste noch doppelt angezeigt), da wird das dann auch drin sein. Das ist jetzt echt sehr komfortabel...
Miniaturansicht angehängter Grafiken
fastmm.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.240 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Speicherleaks finden mit FastMM4

  Alt 12. Jun 2020, 20:10
Ich habe das jetzt mal ein wenig lesbarer gestaltet, siehe anliegenden Screenshot im Vergleich zum vorherigen post.

Ferner habe ich in der Hilfe noch mal eine Beschreibung aufgenommen, wie man den fastMM4 in das Projekt integriert und was man sonst noch so einstellen muss.

In der Hilfe verweise ich zudem auf Bernds video (siehe oben) und auf den Source bei Github.

Die aktualisierte Version 3.37 vom Pascal Project Manager & Editor (die nun auch Delphi 10.4 unterstützt) habe ich gerade hochgeladen:

https://hastasoft.de/PPME.htm
Miniaturansicht angehängter Grafiken
fastmm2.jpg  
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.388 Beiträge
 
Delphi XE5 Professional
 
#19

AW: Speicherleaks finden mit FastMM4

  Alt 16. Jun 2020, 09:29
Außerdem gibt es doch seit Kurzem FastMM5 ohne die Inc-Datei.
Schade, Version 5 steht unter GPL Lizenz - dadurch in kostenfreien aber closed Source-Projekten nicht einsetzbar ohne die 100 Taler zu berappen.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.848 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#20

AW: Speicherleaks finden mit FastMM4

  Alt 16. Jun 2020, 10:01
Schade, Version 5 steht unter GPL Lizenz - dadurch in kostenfreien aber closed Source-Projekten nicht einsetzbar ohne die 100 Taler zu berappen.
Wie viele kostenlose aber closed Source-Projekte gibt es denn, die heftigst multithreading betreiben, für dass sie FastMM5 benötigen?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf