Ich habe eine Anwendung, die in dieser Version etwa 100k mehr vom Desktop Heap verwendet als in der letzten Version. Gibt es eine Möglichkeit zu sehen, was sich auf dem Desktop Heap befindet und wie groß die einzelnen Objekte sind? Unter Dheapmon Ich konnte sehen, wie viel Prozent des Heaps ich benutzte, aber ich möchte mehr Details.
Antworten
Zu viele Anzeigen?Dheapmon ist das einzige Tool, das ich kenne, um den Desktop-Heap direkt zu betrachten, aber haben Sie versucht, Ihre Anwendung mit einem Tool wie Winspector um nach eklatanten Unterschieden zwischen den beiden Versionen zu suchen (z. B. eine Art von Steuerelement in Ihrer Anwendung enthält jetzt viel mehr Fenster)? Besteht die Möglichkeit, dass die Anwendung zu einer neueren Version des IE gewechselt hat? Ich meine mich daran zu erinnern, dass IE7 viel mehr Heap-Intensität auf dem Desktop hat als IE6...
Gestohlen aus einem Kommentar zu einem Blogbeitrag aquí
Lass mich ein wenig Hintergrundwissen darüber geben, wie Desktop-Heap-Zuweisungen vorgenommen werden. Die Desktop-Heaps befinden sich im Kernel-Modus virtuellen Adressraum, so dass einzelne Desktop-Heap-Zuweisungen müssen von einer im Kernel-Modus laufenden Komponente Modus läuft. Insbesondere win32k.sys ist die einzige Komponente im Kernelmodus, die Desktop-Heap-Zuweisungen vornimmt. win32k.sys in der Kernel-Modus-Seite von Win32, und enthält sowohl den Fenstermanager (USER) und GDI. Es ist der Fenster Teil des Fenstermanagers von win32k.sys, der den Desktop-Heap. Die Funktionalität des Fenstermanagers ist den Prozessen ausgesetzt die im Benutzermodus laufen, durch user32.dll. Es ist user32.dll, die aufrufbare Funktionen für den Benutzermodus exportiert die in win32k.sys implementiert sind. Also wenn ein Prozess die user32.dll nicht lädt, wird er den Desktop-Heap nicht verwenden.
Bezüglich Ihrer Frage nach Einstellung einen Haltepunkt die den Desktop einfangen werden Heap-Zuweisungen abfängt... ja, es gibt eine solche Funktion - win32k!DesktopAlloc . Dies ist jedoch eine Kernel-Modus Funktion, und um einen Haltepunkt auf zu setzen, müssen Sie ein Kernel Debugger.
Für mich, der sich noch nie aus dem Benutzermodus von Windows herausgewagt hat, klingt das alles erschreckend kompliziert.
Als ich ein ähnliches Problem hatte, habe ich einfach überall im Startbereich unserer Anwendung Haltepunkte gesetzt. Bei jeder Unterbrechung beobachtete ich die Menge der zugewiesenen Handles und was dhelpmon mir sagte. Mit einer Art binärer Suche begann ich einzugrenzen, wo die Zuweisungen stattfanden.
Sie können den Heap mit dem Win32-API-Aufruf HeapWalk . Sie können anrufen GetProcessHeap um alle Heaps zu erhalten, die dem Prozess zur Verfügung stehen, wenn Sie mehr als nur den Standard-Heap verwenden wollen.