Wie kann ich Handle-Leak- in Windows aufspüren?

win7In diesem Blog-Beitrag möchte ich kurz die Frage beleuchten, wie sich der Verursacher eines Handle-Leak in allen aktuellen Windows-Versionen aufspüren lässt. Handle-Leaks kommen zwar selten vor, aber wenn, sind sie lästig. Dann ist es gut, wenn man ein paar Diagnoseansätze kennt.

Was sind eigentlich Handles und wer braucht die?

Handles sind Referenzen zu einer vom Betriebssystem verwalteten Ressource (siehe). Auch in Windows kommen Handles zum Einsatz, denn die Verwaltung von Dateizugriffen durch Windows erfolgt durch sogenannte Handles. Diese werden auf Anforderung eines Programmes vom Betriebssystem beim Öffnen von Dateien bereitgestellt. Über das Handle kann das Programm also Windows anweisen, auf die Datei zuzugreifen.

Und wie kommen Handle-Leaks ins Spiel?

In einer idealen Welt fordert eine Anwendung ein Handle vom Betriebssystem an, führst seine Dateizugriffe durch und gibt das Handle an das Betriebssystem zurück. Beim Beenden eines Programm kann das Betriebssystem zudem die von den zugehörigen Prozessen benutzten Handles wieder freigeben.

Werden angeforderte Handles durch (Programm-)Fehler nicht wieder freigegeben, und fordert ein Prozess immer weitere Handles (ggf. für die gleiche Datei) an, kommt es zu einem sogenannten Handle-Leak. Irgendwann hat das Betriebssystem keine freien Handles mehr zur Verfügung und wird eine Fehlermeldung auswerfen.

Besondern fies: Oft tritt das bei länger laufenden Systemen nach ein paar Tagen auf. Die Anregung zu diesem Blog-Beitrag kam über eine Forenanfrage im Microsoft-Anwers-Forum. Dort war es ein Windows 7-Rechner, auf dem ein Prozessleitsystem (zur Steuerung oder Visualisierung einer Anlage) läuft. Ist natürlich tödlich, wenn das System nach ein paar Tagen dem Operator meldet, dass kein Speicher mehr frei sei, weil die Handles ausgegangen seien.

Dieser Foren-Beitrag befasst sich z.B. mit der Frage, wie viele Handles in Windows zu viel sein kann. Hintergrund ist, dass durch diese offenen Handles der von einem Prozess verwendbare Speicher abnimmt und irgendwann zur Neige geht. Eine tiefergehende Behandlung des Ganzen findet sich in diesem Technet Blog-Beitrag.

Wie kann ich Handle-Leaks erkennen?

Einmal gibt es natürlich den Fall, dass Windows eine Fehlermeldung bringt, weil keine freien Handles mehr vorhanden sind. Aber vor Auftreten des Fehlers wäre es gut, wenn man ein Handle-Leak erkennen könnte. Denn im dümmsten Fall bleibt das lange unentdeckt, weil der Rechner vor Erreichen der maximalen Handle-Grenze heruntergefahren wurde. Eine Diagnose ist also hilfreich.

Hier kann ich es mir einfach machen. Microsoft hat in den Technet-Blogs den Beitrag How to troubleshoot a handle leak? veröffentlicht, der die benötigten Ansätze zeigt. Es reicht, den Task-Manager unter Windows zu öffnen und zur Registerkarte Leistung zu wechseln. Dort wird dynamisch die Anzahl der offenen Handles aufgeführt.

Der angezeigte Wert wird zwar stark schwanken und auch immer mal wieder zunehmen. Es sollten aber auch wieder Handles freigegeben werden, so dass der Wert in „Handles“ wieder sinkt. Steigt der Handles-Wert über Stunden oder Tage kontinuierlich an, liegt mit hoher Wahrscheinlichkeit ein Handle-Leak vor.

Wie kann ich den Verursacher finden?

Auch hier hilft der Task-Manager, wenn auch ein Kniff erforderlich ist. Auf der Registerkarte Prozesse werden alle laufenden Prozesse aufgelistet. Man sieht auch deren CPU-Auslastung. Nur von Handles, die der Prozess verwendet, ist nichts zu sehen. Aber man kann das Menü Ansicht des Task-Manager-Fensters öffnen und den Befehl Spalten auswählen anklicken. In nachfolgend gezeigtem Dialogfeld lässt sich das Kontrollkästchen bei Handles markieren.

Anschließend zeigt der Task-Manager auf der Registerkarte Prozesse für jeden Prozess die Zahl der verwendeten Handles an.

Man kann also in Ruhe die Liste der offenen Prozesse durchgehen und beobachten, welche Prozesse die meisten Handles geöffnet haben und ob dort ein Prozess ständig neue Handles anfordert, aber nicht freigibt (der Handle-Wert sollte kontinuierlich steigen). Noch ein kleiner Trick: Klickt man auf den Spaltentitel Handles der Registerkarte Prozesse, wird die Anzeige nach dieser Spalte sortiert. Die Prozesse mit den höchsten Handles stehen dann am Listenanfang.

Tipp: Der Technet-Artikel gibt auch noch Faustregeln zur Analyse – nicht dass man an der falschen Stelle sucht. Hier der Auszug:

32-bit Windows XP, Server 2003, Vista, Server 2008, 7 (gilt auch für 8, 8.1):

For most processes, if higher than 2,500 handles open, investigate.
Exceptions are:

System 10,000
lsass.exe 30,000
store.exe 30,000
sqlsrvr.exe 30,000

64-bit Windows XP, Server 2003, Vista, Server 2008, 7, Server 2008 R2 (auch 8, 8.1):

For most processes, if higher than 3,000 handles open, investigate.
Exceptions are:

System 20,000
lsass.exe 50,000
store.exe 50,000
sqlsrvr.exe 50,000

Also: Die oben genannten Prozesse kann man erst einmal ignorieren, und sich die restlichen Werte für die Handles ansehen.

Ursache ermitteln – nur für Entwickler

Für Endanwender ist meist Schluss, sobald der Verursacher aufgespürt ist. Man kann dann auf den Start des Programms verzichten und dessen Entwickler kontaktieren. Der Entwickler muss dann aber die Ursache herausfinden. Hat man den Verursacher aufgespürt, gilt es, in einem weiteren Diagnoseschnitt den Typ der Handles auszuwerten und ggf. weitere Rückschlüsse zu ziehen. Hierzu ist der Process Explorer aus der Sysinternals Suite verwendbar. Auch dazu enthält der Technet-Artikel Hinweise und Tipps. Der Abschnitt zum Debuggen hilft dann ggf. die betreffenden Codestellen, die das Handle-Leak verursachen, zu identifizieren.

Links:
a1: How to troubleshoot a handle leak? Technet-Artikel
a2: Sysinternals Handle
a3: Sysinternals Process Explorer
a4: So ermitteln Sie Dateihandles (MS-Support-Artikel)

Dieser Beitrag wurde unter Problemlösung abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert