Erkennen von Dateihandle-Lecks mit Win32 C ++

8

Gibt es eine Möglichkeit, Dateihandle-Lecks beim Beenden des Programms zu entdecken?

Insbesondere möchte ich sicherstellen, dass alle meine Handles, 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 alle geschlossen sind.

    
Brian R. Bondy 24.11.2008, 20:55
quelle

10 Antworten

5

Ich habe den Befehl! htrace von windbg verwendet.

%Vor%

Erlaubt es Ihnen, die Handle-Situation von zwei Ausführungspunkten zu vergleichen und Ihnen dabei zu helfen, den Punkt zu lokalisieren, an dem der durchgesickerte Handle zugewiesen wurde.

Es hat gut für mich funktioniert.

    
Vivian De Smedt 28.06.2010, 09:38
quelle
7

Wenn Sie können (dh wenn es sich nicht um eine riesige Legacy-Code-Basis handelt, die Sie bugfixen), sollten Sie die RAII Idiom um Ihre Dateigriffe zu wickeln. Indem Sie das Datei-Handle im Konstruktor "übernehmen" und es im Destruktor freigeben, können Sie sicher sein, dass Ihr Datei-Handle zu dem Zeitpunkt, zu dem Ihre RAII den Gültigkeitsbereich 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, um solche Probleme in C ++ zu vermeiden.

    
Joris Timmermans 25.11.2008 09:25
quelle
4

Sie können auch MS Application Verifier verwenden.

    
John Dibling 24.11.2008 21:08
quelle
4

Wenn Sie sich BoundsChecker oder ähnliches nicht leisten können ...

Ein Trick, den ich benutzt habe, ist CreateFile etc. durch eigene 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 einschließen, um sicherzustellen, dass ordnungsgemäß geschlossene Handles keine falschen positiven Ergebnisse auslösen.

Es ist so einfach wie:

%Vor%

Sie definieren dann DbgCreateFileW und DbgCreateFileA irgendwo in Ihrem Code.

Dies setzt voraus, dass Sie die Kontrolle über die relevanten Codeabschnitte haben. Wenn nicht, können Sie etwas Ähnliches tun, indem Sie (z. B.) Microsoft Detours verwenden (Sie benötigen eine Lizenz, um es in ein freigegebenes Produkt aufzunehmen, aber ich glaube, dass es zum Debuggen / Testen / etc. Frei ist).

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

    
Roger Lipscombe 14.01.2009 11:55
quelle
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.

    
Tim 24.11.2008 20:59
quelle
1

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

    
Marcin 24.11.2008 22:13
quelle
1

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

Es zeigt Ihnen die Dateisystem-Aktivität, so dass es Sie beim Auffinden von offenen Handles unterstützen sollte.

    
bernhardrusch 27.11.2008 14:43
quelle
1

Ich empfehle dieses Tool Speichervalidator

es ist sehr nett.

    
Ahmed Said 14.01.2009 12:55
quelle
0

Wie MadKeithV gesagt hat, können Sie RAII mit großer Wirkung einsetzen.

Auch ein einfacher Weg (und kostenlos) ist Visual Leak Detector . Es ist nicht perfekt, aber ein guter Weg, um sicherzustellen, dass Sie frei haben / löschen [] d / close'd, etc.

    
graham.reeds 14.01.2009 12:05
quelle
0

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

Es kann auch etwas in powerdbg ( Ссылка ) geben, um diesen Vorgang zu automatisieren.

Natürlich geht das davon aus, dass Ihre Zeit günstiger ist als der Kauf einer Lösung:)

    
a_mole 24.02.2009 22:31
quelle

Tags und Links