2008-11-24 10 views
8

Gibt es eine Möglichkeit, Dateihandle-Lecks bei Programmbeendigung zu erkennen?Erkennen von Dateihandle-Lecks mit Win32 C++

Insbesondere möchte ich sicherstellen, dass alle meine Punkte, die erstellt werden, in Code freigegeben werden.

Zum Beispiel kann ich irgendwo eine CreateFile() haben, und bei Programmbeendigung möchte ich erkennen und sicherstellen, dass sie alle geschlossen sind.

Antwort

5

ich verwendet habe! Htrace Befehl von windbg.

Ermöglicht Ihnen, die Handle-Situation von zwei Ausführungspunkten zu vergleichen und Ihnen dabei zu helfen, den Punkt zu finden, an dem der ausgelöffelte Handle zugewiesen wurde.

Es funktionierte gut für mich.

+0

wird dies Call-Stack von zugewiesenen Handles zwischen Snapshots geben? – paulm

1

BoundsChecker oder andere ähnliche Programme werden das tun. Ich dachte auch, dass das Ausführen des Debuggers in VC6 und höher die Liste der Lecks melden würde. Vielleicht liegt das daran, dass ich immer Plugin-Tools hatte, um so etwas zu tun.

4

Sie können auch MS Application Verifier verwenden.

+0

Ein kurzes Lesen der Dokumentation verrät nichts über die Erkennung von Handlecks. Was vermisse ich? –

+0

der Trick ist, dass der Code in einer DLL sein muss, wenn es die Lecksuche entlädt wird gelake Handles und Leaked Heap Allocums – paulm

1

Verwenden Sie Smartpointer für Dateihandles und ähnliche Ressourcen.

7

Wenn Sie können (d. H., Wenn es keine große Legacy-Code-Basis ist, die Sie Bugfixing) sollten Sie die Verwendung der RAII Idiom, um Ihre Datei behandeln umschließen. Indem Sie das Datei-Handle im Konstruktor "übernehmen" und es im Destruktor freigeben, können Sie sicher sein, dass Ihr File-Handle zu dem Zeitpunkt, zu dem Ihre RAII den Geltungsbereich verlässt, ebenfalls gut bereinigt ist.

Es ist das gleiche Prinzip wie intelligente Zeiger, und es ist ein sehr nützliches Konzept in Ihrer Toolbox zu haben, um solche Probleme in C++ zu vermeiden.

1

Ein weiterer Tipp wäre der SysInternals FileMon (Link).

Es zeigt Ihnen die Dateisystem-Aktivität, so sollte es Sie bei der Suche nach offenen Handles unterstützen.

4

Wenn Sie Bounds oder ähnliches nicht leisten können ...

Ein Trick, den ich verwendet habe, ist CreateFile usw. mit meinem eigenen Wrapper zu ersetzen. Sie geben nicht nur den Handle-Wert zurück, sondern machen auch eine Aufzeichnung von __FILE__ und __LINE__, die zu jedem Handle gehören. Sie müssen auch CloseHandle umbrechen, um sicherzustellen, dass ordnungsgemäß geschlossene Handles keine falsch positiven Ergebnisse auslösen.

Es ist so einfach wie:

// StdAfx.h 
#include <windows.h> 
#undef CreateFile 
#if defined(UNICODE) 
#define CreateFile DbgCreateFileW 
#else 
#define CreateFile DbgCreateFileA 
#endif 

// etc. 

Sie dann DbgCreateFileW und DbgCreateFileA irgendwo in Ihrem Code definieren.

Dies setzt voraus, dass Sie die Kontrolle über die relevanten Codeabschnitte haben. Wenn nicht, können Sie etwas Ähnliches tun, indem Sie (zB) Microsoft Detours verwenden (Sie benötigen eine Lizenz, um es in ein freigegebenes Produkt aufzunehmen, aber ich glaube, dass es kostenlos für Debugging/Testen/etc. Verwendet werden kann)

Auf lange Sicht sollten Sie jedoch versuchen, Ihren Code so zu konvertieren, dass er einen "intelligenten" Handle-Typ verwendet, der automatisch CloseHandle aufruft, wenn er den Gültigkeitsbereich verlässt.

0

Wie MadKeithV sagte, können Sie RAII mit großer Wirkung verwenden.

Auch eine einfache Möglichkeit (und kostenlos) ist Visual Leak Detector zu verwenden. Es ist nicht perfekt, aber ein guter Weg, um sicherzustellen, dass Sie frei haben/löschen [] d/close'd usw.

0

windbg oder ntsd haben eine! Handle-Erweiterung, die Ihnen sagt, welche Griffe eine App geöffnet hat. Ich nehme an, Sie könnten am Ende Ihres Programms einen Haltepunkt setzen und die Griffe dort ablegen.

Es kann auch etwas in powerdbg (http://www.codeplex.com/powerdbg) zu tun, um diesen Prozess zu automatisieren.

Natürlich setzt dies voraus, Ihre Zeit ist billiger als eine Lösung zu kaufen :)