Gibt es eine Möglichkeit zu prüfen ob die (eigene) Anwendung noch offene Handles hat?
-
Hi,
mit _CrtDumpMemoryLeaks() aus crtdbh.h kann man ja prüfen ob es Memory leaks gibt, aber gibt es auch eine Möglichkeit zu prüfen ob mein Programm noch offene HANDLEs hat?
-
Nein!
Wäre an sich auch egal, da bei Beenden eines Prozesses alle Handles geschlossen werden.
-
Wie, nein? Bin mir ziemlich sicher dass das irgendwie gehen muss. Umgekehrt geht es ja auch, also dass man zu z.B. einem bestimmten File rausbekommt welche Prozesse das File offen haben. Würde mich wundern wenn es dann nicht auch geht rauszubekommen welche Handles der "eigene" Prozess offen hat.
Alleine die Info "ob" es noch offene Handles gibt ist, zugegeben, ziemlich für nix, da wohl immer irgendwelche Handles offen sein werden. Eine Liste sämtlicher Handles könnte allerdings sehr hilfreich sein. z.B. wenn man Resource-Leaks finden will.
-
Der Process Explorer von Sysinternals hilft da weiter.
Simon
-
"Nein", heißt es gibt kene offizielen Windows API Funktionen, die solch ein Ergebnis wie "Offene Handles" liefern.
Alles was man offiziel annehmen kann, das kann man auch in J.Richters Buch, "Advanced Windows" Kapitel 2 lesen, oder eben in der MSDN.
Was SysInternal Tools liefern und wie es funktioniert ist wieder eine andere Sache, aber eben oft auch nicht dokumeniert.Nur mal so ins Unreine:
HANDLEs für Kernelobjekte sind ja nur ein simpler Index in eine lokale Tabelle. Eine obere Grenze kann man aber so einfach nicht ermitteln.
Man könnte einfach mal Anfangen bei 1 und mal durchzählen lassen und auf dieses Handles GetHandleInformation loslassen...IMHO gibt es hier noch ein weiteres Problem, weil ein Kernel Objekt mehrfach geöffnet (und auch dupliziert) werden können (Events, Prozesse, Threads). Entsprechend oft müsste auch CloseHandle aufgerufen werden... aber über diesen internen Zähler schweigt sich die API auch aus.
-
Ok, danke

Dass es immer offene HANDLEs gibt hab ich mir schon gedacht, aber am Ende der main() sollten ja nur noch HANDLEs offen sein die ich nicht selber geöffnet habe und ich kann so einigermaßen sicher nachprüfen ob ich meine neuen HANDLEs auch alle wieder freigegeben habe indem ich die Anzahl der HANDLEs beobachte.
Zugegeben das iat natürlich weit davon entfernt wasserdicht zu sein, aber etwas nützen würde es schon, insofern der Aufwand relativ klein wäre.
Aber der ProcessExplorer von SysInternals ist eine gute Idee

-
@Windowzer:
Der Windows Task-Manager kann es auch anzeigen, musst du dir nur die entsprechende Spalte dazublenden.BTW: wenn es der Task-Manager anzeigen kann, dann müsste es doch einen Performance-Counter dafür geben... nicht? Natürlich bekommt man dann wirklich nur die Anzahl, und das vermutlich auch noch etwas verzögert, aber immerhin etwas.
-
hustbaer schrieb:
@Windowzer:
Der Windows Task-Manager kann es auch anzeigen, musst du dir nur die entsprechende Spalte dazublenden.BTW: wenn es der Task-Manager anzeigen kann, dann müsste es doch einen Performance-Counter dafür geben... nicht? Natürlich bekommt man dann wirklich nur die Anzahl, und das vermutlich auch noch etwas verzögert, aber immerhin etwas.
Wenn ich mich richtig erinnere gab es doch eine SysInternals Anwendung welche einem alle WinApi-Calls einer Anwendung angezeigt hat.
Damit sollte man das doch rausfinden können, weiß jemand wie diese heißt?
-
Keine Ahnung. Es gibt übrigens wirklich einen Performance-Counter allerdings bin ich mir nicht so sicher ob der nicht Blödsinn anzeigt.
Bei meiner explorer.exe hat er gerade 190k Handles angezeigt. Der ProcessExplorer hat aber bloss ein paar hundert aufgelistet.