2013-10-11 11 views
5

Wir haben eine kleine Testsuite für unsere Windows Forms-UI-Rendering-Engine entwickelt, mit der Sie die Leistung messen und Speicherverluste erkennen können, während Testfälle automatisiert ausgeführt werden. Jetzt möchten wir auch nach Handle-Lecks suchen. Auf der Desktop-Plattform können wir diesen Code verwenden:Ermitteln der Anzahl der GDI-Handles und USER-Objekte

[DllImport("User32")] 
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); 

using (var process = Process.GetCurrentProcess()) 
{ 
    var gdiHandles = GetGuiResources(process.Handle, 0); 
    var userHandles = GetGuiResources(process.Handle, 1); 
} 

Diese Methode scheint nicht in Windows Mobile verfügbar. Gibt es eine andere Möglichkeit, diese Werte programmgesteuert unter Windows Mobile/CE zu ermitteln?

Antwort

1

Dies ist eher ein Vorschlag als eine Antwort.

Sie könnten verlangen, dass alle Ihre "handle" -Methoden in einer separaten Klasse platziert werden (Ich habe eine Klasse namens User32, coreDLL, etc).

Anschließend können Sie entweder bei jeder Verwendung einer Ressource einen Zähler erhöhen oder jede neue von Ihnen erstellte Kennung zu einer privat verwalteten Liste hinzufügen, bevor Sie diese Kennung übergeben.

Stellen Sie jetzt vor dem Schließen Ihres Projekts sicher, dass der Zähler auf Null zurückgesetzt ist oder alle Punkte in der Liste geschlossen sind.

Nicht getesteter Code - Ich habe VS2008 momentan nicht hier.

[DllImport("User32")] 
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); 

private static List<IntPtr> m_handles = new List<IntPtr>(); 

public static IntPtr[] GetGuiResources() { 
    using (var process = Process.GetCurrentProcess()) 
    { 
    var gdiHandles = GetGuiResources(process.Handle, 0); 
    m_handles.Add(gdiHandles); 
    var userHandles = GetGuiResources(process.Handle, 1); 
    m_handles.Add(userHandles); 
    } 
    return new IntPtr[] { m_handles[m_handles.Count - 2], m_handles[m_handles.Count - 1] }; 
} 

public static void Close() { 
    for (int i = m_handles.Count - 1; -1 < i; i--) { 
    var handle = m_handles[i]; 
    // release your handle 
    } 
} 

Noch einmal, das ist nur eine Idee. Ich hatte dieses Problem nie zuvor, also habe ich keine Ahnung, wie gut es funktioniert oder ob es für einen "mir unbekannten" Grund fehlschlagen würde.

So würde ich logischerweise das Projekt starten.

+0

Soweit ich Ihren Ansatz verstehe, würde dies erfordern, dass ich die gesamte Ressourcenbehandlung in unserer Anwendung neu schreiben, die derzeit von Windows Forms (irgendwo tief in 'Pen', 'Graphics' und' Bitmap') behandelt wird - nur für Der Grund für das Testen auf Ressourcen-Handle-Lecks. Da solche Tests normalerweise kurz vor der Veröffentlichung einer neuen Version durchgeführt werden, beobachte ich eher das Verhalten der Anwendungen mit den vorhandenen Tools. Wie auch immer, danke für deinen Vorschlag - ich schätze die Mühe. – Gene

+0

Sicher tun Sie dies nicht vor der Bereitstellung, nein. Dies wäre jedoch ein besseres Design für Ihre Anwendung. Denk an zukünftige Releases. :) – jp2code