![]() |
Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Grüße,
folgende Situation in unserer Anwendung: - FastMM 4.78 mit FullDebugMode, LogMemoryLeakDetailToFile - TaskManager zum überprüfen - 17MB Speicherauslastung wenn der Sende-Assistent angeworfen wird - Zum Testen hab ich die Sende-Listen (die auf dem Bildschirm angezeigt werden) mal schön vollgepackt mit 300-600 Einträgen, fast alle mit Bildern und anderen Symbolen - Je nach Liste steigt die Auslastung während der Sendung auf 170MB bis 440MB - Nach der Liste gibt er allerdings nur bis auf 24-28MB wieder frei, das schaukelt sich auch weiter hoch bis 38MB, von Anfangs 17MB beim Start. Ich hab nun das meiste was aus der Log-Datei vom FastMM nachvollziehbar ist bereinigt. Jetzt sind nur noch die Meldungen da, die ich nicht nachvollziehen kann und die ich auch bekomme, wenn ich die Software nur starte und gleich wieder schließe. Also eher irrelevant: Zitat:
Meine Frage nun: Wie zuverlässig ist FastMM in dieser Hinsicht? "Übersieht" er irgendwas? Oder warum zeigt mir der TaskManager nach jeder Liste mehr Speicherverbrauch an? :gruebel: |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Guckst du
![]() Best FullDebugMode kann er nicht alles freigeben da er sonst die verwendung von freigegebenen Speicherbereichen nicht erkennen könnte. |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Ah, danke. Mal testen. :coder2:
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Hab die Schalter entfernt, die DCUs und die .exe gelöscht, Projekt neu erzeugt.
Start der Sendung mit 14MB, paar Listen laufen lassen, Stop gedrückt, 20MB. FastMM sagt das übliche. Ist das "Overhead", "Cache" oder wo kommen die 6MB her? Und vorallem wie erklär ichs dem Chef? :mrgreen: [edit] Ups, sry für Doppelpost. :stupid: [/edit] |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Hallo,
auch eine Frage: warum kompilierst Du "DesignEditors" in ein Programm, obwohl das die Lizenz verbietet? Oder war das unter D6 noch nicht so? Gruß xaromz |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Wat? :gruebel:
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
So ... Hab das Senden jetzt die ganze Nacht mit diesen großen Listen und dem ausgestellten Debug-Mode vom FastMM laufen lassen. Zwischendurch hab ich im Task-Manager immer mal wieder reingeschaut und gesehen, dass er sich kontinuierlich hochschaukelt. Irgendwann gegen 22°° warens dann bei über 300MB - von Anfangs 12MB - die er nach jeder Liste an Speicherauslastung hinterlassen hatte.
Und heute früh - bzw grad eben - rief Chef an und er meinte die Software sei einfach aus. Keine Fehlermeldung, kein garnix, einfach aus. Und FastMM schweigt ... er meint tatsächlich da seien keine Memory Leaks. Was ist da los?! :gruebel: |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Hast du evtl. GDI-Ressourcen-Lecks? Da kann FastMM und die dortigen Checkmöglichkeiten nix ausrichten da die dortigen Ressourcen nicht unter seiner Kontrolle liegen. Hier wäre z.B. AQTime angesagt. Dort gibt es einen entsprechenden Ressource-Profiler.
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Sorry für die Frage, aber wie find ich das raus, ob ich GDI-Resource-Leaks hab?
Saug mir grad die Trial von AQTime. |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Zitat:
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Ah, danke.
Stimmt, die wachsen langsam an. Zum Start warens 187, nach der 4. Liste inzw. 206 ... Er gibt auch während der Sendung immer mal wieder 1-2 frei, geht dann aber wieder auf 206 ... Grad bei 208 ... Also Tendenz scheint langsam aber sicher nach oben zu gehen. "GDI" ist relativ unbekanntes Theretorium für mich. Hab den Begriff zwar schon zig mal gehört, aber direkt zu tun hatte ich damit noch nicht. Wie können da Leaks entstehen? |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Zitat:
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Ja, während der Sendung läuft zB meist ein Oszilloskop (kommt drauf an, was man für 'ne Hardware dranhängen hat) und die dazu gehörigen Listen werden dargestellt. Die können pro Eintrag zwei Symbole haben, was unterm Strich immer ein Bild ist. Selbst wenn kein Symbol eingetragen wurde, wird halt ein "Kein Symbol"-Bild gezeigt, was aus einer ImageList kommt. Sonst wird das dazugehörige Bild von einer externen Quelle geladen.
[edit] Hier mal der Code vom Zeichnen der Symbole.
Delphi-Quellcode:
[/edit]
procedure DrawCellSymbol (Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; CellRect: TRect; ImageList: TImageList; Symbol1Col, Symbol2Col: Integer; CategoryId: Integer); var bmp: TBitmap; ThumbFileName, Text: String; SymbolIndex, DrawX, DrawY, ImageIndex: Integer; Data: PDatabaseData; DrawRect: TRect; JPG: TJPEGImage; iSymbolType: TSymbolType; iSymbol: TSymbolStream; HasThumbnail, SaveThumbnail, DrawSymbol: Boolean; begin if (Column <> Symbol1Col) and (Column <> Symbol2Col) then Exit; Data := Sender.GetNodeData (Node); SymbolIndex := 0; if Column = Symbol1Col then begin SymbolIndex := 1; DrawSymbol := TRUE; iSymbolType := Data.SymbolType1; iSymbol := Data.Symbol1; end else if Column = Symbol2Col then begin SymbolIndex := 2; DrawSymbol := TRUE; iSymbolType := Data.SymbolType2; iSymbol := Data.Symbol2; end else DrawSymbol := FALSE; ThumbFileName := GetApplicationPersonalThumbsPath + inttostr (Node.Index) + inttostr (Data.ID) + inttostr (Data.HealingsheetIndexID) + inttostr (SymbolIndex) + inttohex (CategoryId, 8) + '.bmp'; if DrawSymbol then begin bmp := TBitmap.Create; try case iSymbolType of stNoSymbol: ImageIndex := 0; stImage: ImageIndex := 1; stSound: ImageIndex := 2; stVibration: ImageIndex := 4; else ImageIndex := 3; end; // Wenn Symbol ein Bild ist, externe Datei laden if (iSymbolType = stImage) then begin HasThumbnail := FileExists (ThumbFileName); if HasThumbnail then bmp.LoadFromFile (ThumbFileName); iSymbol.Position := 0; if not HasThumbnail then begin if (Is_BLOB_JPG (iSymbol)) then begin JPG := TJPEGImage.Create; JPG.LoadFromStream (iSymbol); bmp.Assign (JPG); FreeAndNil (JPG); end else bmp.LoadFromStream (iSymbol); end; end else ImageList.GetBitmap (ImageIndex, bmp); // ... sonst aus ImageList das dazugehörige Symbol with TargetCanvas do begin Font.Color := Sender.Font.Color; Text := SymbolTitles[ImageIndex]; DrawRect := ClipRect; DrawRect.Right := DrawRect.Right - 8; DrawText (TargetCanvas.Handle, PChar (Text), Length (Text), DrawRect, DT_SINGLELINE or DT_VCENTER or DT_RIGHT); if (iSymbolType = stImage) then begin SaveThumbnail := FALSE; // Bild neu skalieren? SaveThumbnail := ResizeBitmap (bmp, 80, 80); DrawX := ClipRect.Left + Round ((ClipRect.Right - ClipRect.Left) / 2) - Round (bmp.Width / 2); DrawY := ClipRect.Top + Round ((ClipRect.Bottom - ClipRect.Top) / 2) - Round (bmp.Height / 2); Draw (DrawX, DrawY, bmp); if SaveThumbnail then if (Data.ID = 0) and (Data.HealingsheetIndexID = 0) then SaveThumbnail := FALSE; if SaveThumbnail then bmp.SaveToFile (ThumbFileName); end else begin DrawRect := ClipRect; DrawRect.Left := DrawRect.Left + (Sender as TVirtualStringTree).Margin + 4; DrawRect.Top := DrawRect.Top + (Round ((DrawRect.Bottom - DrawRect.Top) / 2) - 16); Draw (DrawRect.Left, DrawRect.Top, bmp); end; end; finally FreeAndNil (bmp); end; end; end; |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Ja, das könnte dann passen... GDI ist die Graphikschnittstelle von Windows (mittlerweile durch GDI+ mehr oder weniger abgelöst?) - aber wenn du sagst, dass FastMM keine Speicherlecks anzeigt, wundere ich mich, warum GDI-Handles nicht freigegeben werden :?
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Ist das normal, dass AQtime den Prozess so derb bremst, dass er jetzt zum Laden der Liste mit 560 Einträgen (440MB) nach über ner halben Stunde grad mal bei der Hälfte ist (221MB laut TM), wo er vorher paar Sekunden gebraucht hat ...?
... Und zwei AVs "Lesen von Adresse 00000000" kamen beim Start des Projekts aus AQtime auch. :gruebel: [edit] Sorry Bernhard, aber was ist das bitte für eine "Award winning"-Software die du mir da empfohlen hast? :mrgreen: Ich hocke hier schon seit über 'ner Stunde ohne Ergebnisse rum und versuche, das mein Projekt mal eine Liste sendet, damit ich mal was in AQtime sehe. Ich hab mein Projekt gestartet und AQtime an den Prozess angehangen. Aber selbst bei nur einer Liste im Sendeplan mit nur einem Text-Eintrag hat der hier seit über 5 Minuten voll zu tun, Prozess ist blockiert, er müllt mir den Speicher weiter zu (77MB ... es ist nur ein Text-Eintrag) und kommt nicht zu potte ... :wall: [/edit] |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Sorry für's frühe pushen ... Aber ich komme hier echt nicht weiter und stehe (mit Druck von aussen) voll auf dem Schlauch.
Hab das AQtime grad mal für über 15min laufen lassen (war duschen ^^) mit dem Versuch, dass er doch bitte diese eine kleine Mini-Liste abarbeitet, damit ich mal irgendwas sehe. Und als ich wieder kam, hatte er 120MB Speicher-Last, 100% CPU Last und war immernoch am laden. Also das kanns doch nicht sein. Ohne AQ im Hintergrund lädt er die Liste innerhalb von 3sek. :| Angenommen selbst wenn das AQtime funktionieren würde, was würde ich denn da für Informationen erhalten? Wie würde ich an diese GDI-Leaks rankommen? |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Zitat:
Zitat:
Zitat:
|
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Zitat:
Zitat:
---- So, nun hab ich einen Report hier. Die Frage nur, was mach ich damit? Weil so richtig schlau werde ich nicht draus: Zitat:
- gdi32.dll: CreateDIBSelection "An error occured during the function execution" - gdi32.dll: CreateDIBSelection "Ungültiges Fensterhandle" - ... - kernel32.dll: CreateEventA "Zugriff verweigert" - etc. Die Leaks hab ich mal als Txt Report angehangen (HTML geht nicht als Attachment). Nur was mach ich damit? Wie komme ich an die SysString Leaks? :gruebel: Alles noch bisschen Bahnhof für mich, sorry. :roll: [edit] Attachment aktualisiert [/edit] |
Re: Wie zuverlässig ist der MemoryLeak-Report von FastMM?
*push*
... Stehe immernoch auf dem Schlauch. Was hat es mit diesen "Sys strings" auf sich? Wie komme ich daran und wie kann ich sie freigeben? Googlen nach "Sys strings" oder "AQtime Sys strings leak" brachte nicht die erhofften Hinweise. Ich hab jetzt quasi seit gestern hier am Code gehockt und mal ALLE dynamischen Arrays (einige wurden auch während der Sendung verwendet) als TList-Nachfahren gemacht und den ganzen Spaß durch den ganzen Code hinweg konsequent ersetzt. Ergebnis: AQtime heult mir immernoch was von 1500 "Sys strings" Leaks vor, der TaskManager wächst langsam aber stetig mit jeder fertigen Sendung, FastMM sagt nix von Speicherlecks und mein Sandsack kriegt schon Löcher ... :wall: Help ... :pale: [edit] Vorallem das komische, was mir Mr. Chef auch schon berichtete und was ich vorhin hier auch hatte: Stopt man die Sendungen, geht er von Anfangs 12MB nur noch auf vlt. 32MB - durch die ganzen Listen die durchgelaufen sind. Wechselt man nun paar mal den Task, macht irgendwas anderes, so hab ich durch Zufall vorhin gesehen, dass meine .exe im TaskManager plötzlich nur noch 6MB Speichernutzung angezeigt hat, was dann aber wieder auf 12 hoch ging ... :gruebel: [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 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