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.
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.
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.
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.
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.
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.
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:)
Tags und Links c++ visual-c++ winapi