![]() |
Delphi-Version: 7
Speicherleaks finden mit FastMM4
Liste der Anhänge anzeigen (Anzahl: 1)
Kann mir bitte jemand erklären wie genau die Speicherlecksuche mit FastMM4 funktioniert?
Ich habe in FastMM4Options.inc die Optionen EnableMemoryLeakReporting und FullDebugMode aktiviert. Beispielcoder erzeugt der paar Bytes Speicher leaked. Am Ende der Ausführung bekomme ich die Meldung, dass Speicher geleakt wurde. Details dazu stehen in der LogDatei. Wenn ich jedoch die LogDatei anschaue finde ich (für mich persönlich) keinerlei nützliche Info die mir helfen würde den Ort des Speicherlecks zu finden. Das Testprogramm zeigt die (zufällige) Adresse des Pointers der nicht freigegeben wird als $19FB70. In der LogDatei bekomme einen Stack Trace der mich gar nicht weiter bringt, und einen Speicherauszug von Adresse $7FE35550, die auf dem ersten Blick auch nichts mit dem Leck zu tun hat. Hat jemand von euch vielleicht Tips um die Codezeile mit dem Leak zu finden? Beispielcode inkl FastMM4 mit kompilierter Exe ist angehängt.
Delphi-Quellcode:
var
Form1: TForm1; const data = #255#255#255#255#255#255#255#255#255; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var p: PChar; begin GetMem(p, SizeOf(Data)+1); p := data; Caption := '$'+IntToHex(Integer(Addr(p)), 1)+':'+p; end;
Delphi-Quellcode:
--------------------------------2020/6/11 2:38:16--------------------------------
A memory block has been leaked. The size is: 12 This block was allocated by thread 0x76F0, and the stack trace (return addresses) at the time was: 402D38 451AE4 4496D3 44C6A6 432337 77551031 [RtlCaptureStackBackTrace] 426C41 742C9FCB [SE_GetProcAddressForCaller] 426C41 742C9FE3 [SE_GetProcAddressForCaller] 742CA00D [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 DC 9A 65 A5 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 . € Ü š e ¥ € € € € € € € . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . --------------------------------2020/6/11 2:38:16-------------------------------- 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". |
AW: Speicherleaks finden mit FastMM4
Hallo,
die externen Debug-Optionen einschalten (bei den Linker-Optionen zu finden) |
AW: Speicherleaks finden mit FastMM4
Du hast keine Debuginformationen einkompiliert (sieht man an DebugInfo=0 in der .dof Datei). Ohne bekommst du auch keinen Stacktrace.
In aktuelleren Delphiversionen ist FastMM übrigens schon in Delphi integriert. |
AW: Speicherleaks finden mit FastMM4
Zitat:
Nur mit dem aufgebohrten FastMM per externer Unit+Inc und Debug-DLL bekommt man aussagekräftige Log-Dateien und Warnungen, wenn Speicher durch Überschreiben korrumpiert wird. Das bisschen an Information das per MessageBox vom integrierten FastMM durch ReportMemoryLeaksOnShutdown := True; ggf. gezeigt wird, ist ja nur die Spitze des Eisberges und würde sogar in dem Beispielfall hier null weiterhelfen. |
AW: Speicherleaks finden mit FastMM4
Kennst du mein Video?
Von 0 auf 100 - FastMM4 - Ein Speichermanager für Delphi ![]() |
AW: Speicherleaks finden mit FastMM4
Außerdem gibt es doch seit Kurzem
![]() |
AW: Speicherleaks finden mit FastMM4
Es gibt auch eine AVX Version von FastMM4:
![]() |
AW: Speicherleaks finden mit FastMM4
Ja, aber die ist 2 Jahre alt (Mai 2018). FastMM5 ist von Grund auf neu geschrieben, wie da steht, da sollte FastMM4 obsolet sein.
|
AW: Speicherleaks finden mit FastMM4
MM5 geht imho erst ab XE3. FastMM4-AVX ist eine gute Alternative um alten Projekten einen Performance Boost zu geben.
|
AW: Speicherleaks finden mit FastMM4
Zitat:
Eine Frage in diesem Zusammenhang: Die MemoryManager_EventLlog Datei war über 1 MB groß, häufiger mit doppelten Einträgen. Gibt es eigentlich ein Tool, welches die Einträge auswertet und dann die Unit öffnet und zur Zeile springt, wo der Speicherverbrauchende Prozess erzeugt wurde? Denn manuell das alles zu sichten, war schon sehr unkomfortabel... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz