![]() |
Leak im THtmlViewer finden
Hallo,
ich brauch mal etwas Hilfe: Ich muß ein Memory- und Resourcen-Leak im THtmlViewer finden. Die Probleme liegen in der Druckfunktion: 1) Wenn der FastMM4 im FullDebugMode läuft, kann man nur wenige male mit THtmlViewer Drucken, bevor eine Exception kommt. Diese bezieht sich auf eine ungültige GetMem Operation. Log anbei. 2) Der Druck im THtmlViewer führt zu Handle Leaks. Bei jedem Druck wird mindestens 1 Resource-Handle zusätzlich belegt. Testcode (in leerem Projekt):
Delphi-Quellcode:
Wenn man den Button 2-3x mit FastMM drückt kommt:
procedure TForm1.Button1Click(Sender: TObject);
var hv: THTMLViewer; begin Button1.Enabled := False; FastMM4.ScanMemoryPoolForCorruptions; hv := THTMLViewer.Create(nil); try hv.Parent := Self; hv.LoadFromFile('d:\downloads\test.html'); hv.Print(1, 1); finally hv.Free; Button1.Enabled := True; end; FastMM4.ScanMemoryPoolForCorruptions; end; Zitat:
Leider komme ich nicht voran. Hat jemand Ideen? Nachtrag 1: Zumindest ein Problem scheint es in HtmlSubs.pas zu geben. Im Kontruktor der TSectionList.CreateCopy wird
Delphi-Quellcode:
aufgerufen. Dies wird von FastMM innerhalb der .Print Routine bemängelt.
System.Move(T.ShowImages, ShowImages, DWord(@Background) - Dword(@ShowImages) + Sizeof(integer));
Gruß Assertor |
Re: Leak im THtmlViewer finden
PreFontName: string; war mal ein ShortString bzw. string[lf_FaceSize+1]. Jetzt wird der string inkl reference count per move kopiert. Das kann nicht gutgehen.
|
Re: Leak im THtmlViewer finden
Hi Sebastian,
Danke für die Hilfe :) Zitat:
Ich sitze auch gerade vor den ganzen System.Move(). Meine Meinung: Alle raus, zumindest außerhalb der GIF/PNG/ZLIB Fkt. Sobald ich obiges mit einer Zuweisung ersetze, gibt es dort auch keine Fehler mehr:
Delphi-Quellcode:
Da hat Baldwin die Rechnung ohne die Größe der Datentypen gemacht.
constructor TSectionList.CreateCopy(T: TSectionList);
begin ... inherited CreateCopy(Self, T); // System.Move(T.ShowImages, ShowImages, DWord(@Background) - DWord(@ShowImages) + Sizeof(Integer)); ShowImages := T.ShowImages; ... end; Übrigens: Das Handle Leak entsteht auch irgendwo im Funktionsablauf von .Print. Soviel weiß ich jetzt schon, aber selbst ein Breakpoint auf die Adresse führt zu nichts. Gruß Assertor |
Re: Leak im THtmlViewer finden
Hi,
nach langer Suche steht nun fest: das Leak ist nicht aus der THtmlView Komponente, sondern aus Printers.pas. Das Codeschnippsel
Delphi-Quellcode:
zeigt das Problem ganz offensichtlich (in D2009 und D2006).
procedure TestPrinter;
var i: Integer; begin for i := 1 to 100 do begin Printer.BeginDoc; Printer.EndDoc; end; end; Ich mach hierzu dann einen neuen Thread auf. Gruß Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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