{"id":148126,"date":"2014-04-14T00:33:00","date_gmt":"2014-04-13T23:33:00","guid":{"rendered":"http:\/\/www.borncity.com\/blog\/?p=148126"},"modified":"2024-08-10T23:20:13","modified_gmt":"2024-08-10T21:20:13","slug":"wie-kann-ich-handle-leak-in-windows-aufspren","status":"publish","type":"post","link":"https:\/\/borncity.com\/blog\/2014\/04\/14\/wie-kann-ich-handle-leak-in-windows-aufspren\/","title":{"rendered":"Wie kann ich Handle-Leak- in Windows aufsp&uuml;ren?"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" style=\"float: left; margin: 0px 10px 0px 0px; display: inline; border-width: 0px;\" title=\"win7\" src=\"https:\/\/borncity.com\/blog\/wp-content\/uploads\/2012\/03\/win7_thumb1.jpg\" alt=\"win7\" width=\"44\" height=\"42\" align=\"left\" border=\"0\" \/>In diesem Blog-Beitrag m\u00f6chte ich kurz die Frage beleuchten, wie sich der Verursacher eines Handle-Leak in allen aktuellen Windows-Versionen aufsp\u00fcren l\u00e4sst. Handle-Leaks kommen zwar selten vor, aber wenn, sind sie l\u00e4stig. Dann ist es gut, wenn man ein paar Diagnoseans\u00e4tze kennt.<\/p>\n<p><!--more--><\/p>\n<h3>Was sind eigentlich Handles und wer braucht die?<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/ssl-vg03.met.vgwort.de\/na\/b36354e7151249a8933415d11b0d3900\" alt=\"\" width=\"1\" height=\"1\" \/>Handles sind Referenzen zu einer vom Betriebssystem verwalteten Ressource (<a href=\"http:\/\/de.wikipedia.org\/wiki\/Handle\" target=\"_blank\" rel=\"noopener noreferrer\">siehe<\/a>). 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 \u00d6ffnen von Dateien bereitgestellt. \u00dcber das Handle kann das Programm also Windows anweisen, auf die Datei zuzugreifen.<\/p>\n<h3>Und wie kommen Handle-Leaks ins Spiel?<\/h3>\n<p>In einer idealen Welt fordert eine Anwendung ein Handle vom Betriebssystem an, f\u00fchrst seine Dateizugriffe durch und gibt das Handle an das Betriebssystem zur\u00fcck. Beim Beenden eines Programm kann das Betriebssystem zudem die von den zugeh\u00f6rigen Prozessen benutzten Handles wieder freigeben.<\/p>\n<p>Werden angeforderte Handles durch (Programm-)Fehler nicht wieder freigegeben, und fordert ein Prozess immer weitere Handles (ggf. f\u00fcr die gleiche Datei) an, kommt es zu einem sogenannten Handle-Leak. Irgendwann hat das Betriebssystem keine freien Handles mehr zur Verf\u00fcgung und wird eine Fehlermeldung auswerfen.<\/p>\n<p>Besondern fies: Oft tritt das bei l\u00e4nger laufenden Systemen nach ein paar Tagen auf. Die Anregung zu diesem Blog-Beitrag kam \u00fcber <a href=\"http:\/\/answers.microsoft.com\/de-de\/windows\/forum\/windows_7-performance\/anzahl-an-handles-nimmt-stetig-zu\/e3ce8f34-4c7f-4f25-82b7-e8aa75c5f387\" target=\"_blank\" rel=\"noopener noreferrer\">eine Forenanfrage<\/a> im Microsoft-Anwers-Forum. Dort war es ein Windows 7-Rechner, auf dem ein Prozessleitsystem (zur Steuerung oder Visualisierung einer Anlage) l\u00e4uft. Ist nat\u00fcrlich t\u00f6dlich, wenn das System nach ein paar Tagen dem Operator meldet, dass kein Speicher mehr frei sei, weil die Handles ausgegangen seien.<\/p>\n<p><a href=\"http:\/\/stackoverflow.com\/questions\/951419\/how-many-windows-handles-in-use-is-too-many\" target=\"_blank\" rel=\"noopener noreferrer\">Dieser Foren-Beitrag<\/a> 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 <a href=\"https:\/\/web.archive.org\/web\/20151206184352\/http:\/\/blogs.technet.com:80\/b\/markrussinovich\/archive\/2009\/09\/29\/3283844.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">diesem Technet Blog-Beitrag<\/a>.<\/p>\n<h3>Wie kann ich Handle-Leaks erkennen?<\/h3>\n<p>Einmal gibt es nat\u00fcrlich den Fall, dass Windows eine Fehlermeldung bringt, weil keine freien Handles mehr vorhanden sind. Aber vor Auftreten des Fehlers w\u00e4re es gut, wenn man ein Handle-Leak erkennen k\u00f6nnte. Denn im d\u00fcmmsten Fall bleibt das lange unentdeckt, weil der Rechner vor Erreichen der maximalen Handle-Grenze heruntergefahren wurde. Eine Diagnose ist also hilfreich.<\/p>\n<p>Hier kann ich es mir einfach machen. Microsoft hat in den Technet-Blogs den Beitrag <a href=\"https:\/\/web.archive.org\/web\/20160301230024\/http:\/\/blogs.technet.com:80\/b\/yongrhee\/archive\/2011\/12\/19\/how-to-troubleshoot-a-handle-leak.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">How to troubleshoot a handle leak?<\/a> ver\u00f6ffentlicht, der die ben\u00f6tigten Ans\u00e4tze zeigt. Es reicht, den Task-Manager unter Windows zu \u00f6ffnen und zur Registerkarte <em>Leistung <\/em>zu wechseln. Dort wird dynamisch die Anzahl der offenen Handles aufgef\u00fchrt.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/i5dXnfn.jpg\" alt=\"\" \/><\/p>\n<p>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 \u00fcber Stunden oder Tage kontinuierlich an, liegt mit hoher Wahrscheinlichkeit ein Handle-Leak vor.<\/p>\n<h3>Wie kann ich den Verursacher finden?<\/h3>\n<p>Auch hier hilft der Task-Manager, wenn auch ein Kniff erforderlich ist. Auf der Registerkarte <em>Prozesse <\/em>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\u00fc <em>Ansicht <\/em>des Task-Manager-Fensters \u00f6ffnen und den Befehl <em>Spalten ausw\u00e4hlen <\/em>anklicken. In nachfolgend gezeigtem Dialogfeld l\u00e4sst sich das Kontrollk\u00e4stchen bei <em>Handles <\/em>markieren.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/oIOS018.jpg\" alt=\"\" \/><\/p>\n<p>Anschlie\u00dfend zeigt der Task-Manager auf der Registerkarte <em>Prozesse <\/em>f\u00fcr jeden Prozess die Zahl der verwendeten Handles an.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/h0tTvpO.jpg\" alt=\"\" \/><\/p>\n<p>Man kann also in Ruhe die Liste der offenen Prozesse durchgehen und beobachten, welche Prozesse die meisten Handles ge\u00f6ffnet haben und ob dort ein Prozess st\u00e4ndig neue Handles anfordert, aber nicht freigibt (der Handle-Wert sollte kontinuierlich steigen). Noch ein kleiner Trick: Klickt man auf den Spaltentitel <em>Handles <\/em>der Registerkarte <em>Prozesse<\/em>, wird die Anzeige nach dieser Spalte sortiert. Die Prozesse mit den h\u00f6chsten Handles stehen dann am Listenanfang.<\/p>\n<p><em>Tipp:<\/em> Der <a href=\"https:\/\/web.archive.org\/web\/20160301230024\/http:\/\/blogs.technet.com:80\/b\/yongrhee\/archive\/2011\/12\/19\/how-to-troubleshoot-a-handle-leak.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Technet-Artikel<\/a> gibt auch noch Faustregeln zur Analyse \u2013 nicht dass man an der falschen Stelle sucht. Hier der Auszug:<\/p>\n<p><strong>32-bit Windows XP, Server 2003, Vista, Server 2008, 7 (gilt auch f\u00fcr 8, 8.1): <\/strong><\/p>\n<p>For most processes, if higher than 2,500 handles open, investigate.<br \/>\nExceptions are:<\/p>\n<blockquote><p>System 10,000<br \/>\nlsass.exe 30,000<br \/>\nstore.exe 30,000<br \/>\nsqlsrvr.exe 30,000<\/p><\/blockquote>\n<p><strong>64-bit Windows XP, Server 2003, Vista, Server 2008, 7, Server 2008 R2 (auch 8, 8.1):<\/strong><\/p>\n<p>For most processes, if higher than 3,000 handles open, investigate.<br \/>\nExceptions are:<\/p>\n<blockquote><p>System 20,000<br \/>\nlsass.exe 50,000<br \/>\nstore.exe 50,000<br \/>\nsqlsrvr.exe 50,000<\/p><\/blockquote>\n<p>Also: Die oben genannten Prozesse kann man erst einmal ignorieren, und sich die restlichen Werte f\u00fcr die Handles ansehen.<\/p>\n<h3>Ursache ermitteln \u2013 nur f\u00fcr Entwickler<\/h3>\n<p>F\u00fcr Endanwender ist meist Schluss, sobald der Verursacher aufgesp\u00fcrt 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\u00fcrt, gilt es, in einem weiteren Diagnoseschnitt den Typ der Handles auszuwerten und ggf. weitere R\u00fcckschl\u00fcsse zu ziehen. Hierzu ist der Process Explorer aus der Sysinternals Suite verwendbar. Auch dazu enth\u00e4lt <a href=\"https:\/\/web.archive.org\/web\/20160301230024\/http:\/\/blogs.technet.com:80\/b\/yongrhee\/archive\/2011\/12\/19\/how-to-troubleshoot-a-handle-leak.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">der Technet-Artikel<\/a> Hinweise und Tipps. Der Abschnitt zum Debuggen hilft dann ggf. die betreffenden Codestellen, die das Handle-Leak verursachen, zu identifizieren.<\/p>\n<p><strong>Links:<\/strong><br \/>\na1: <a href=\"https:\/\/web.archive.org\/web\/20160301230024\/http:\/\/blogs.technet.com:80\/b\/yongrhee\/archive\/2011\/12\/19\/how-to-troubleshoot-a-handle-leak.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">How to troubleshoot a handle leak?<\/a> Technet-Artikel<br \/>\na2: <a href=\"http:\/\/technet.microsoft.com\/de-de\/sysinternals\/bb896655.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Sysinternals Handle<\/a><br \/>\na3: <a href=\"http:\/\/technet.microsoft.com\/de-de\/sysinternals\/bb896653.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Sysinternals Process Explorer<\/a><br \/>\na4: <a href=\"https:\/\/web.archive.org\/web\/20120212070842\/http:\/\/support.microsoft.com:80\/kb\/232830\/de\" target=\"_blank\" rel=\"noopener noreferrer\">So ermitteln Sie Dateihandles<\/a> (MS-Support-Artikel)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Blog-Beitrag m\u00f6chte ich kurz die Frage beleuchten, wie sich der Verursacher eines Handle-Leak in allen aktuellen Windows-Versionen aufsp\u00fcren l\u00e4sst. Handle-Leaks kommen zwar selten vor, aber wenn, sind sie l\u00e4stig. Dann ist es gut, wenn man ein paar Diagnoseans\u00e4tze &hellip; <a href=\"https:\/\/borncity.com\/blog\/2014\/04\/14\/wie-kann-ich-handle-leak-in-windows-aufspren\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[2539,4309,3288],"class_list":["post-148126","post","type-post","status-publish","format-standard","hentry","category-problemlosung","tag-problembehandlung","tag-tipps","tag-windows-en"],"_links":{"self":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/148126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/comments?post=148126"}],"version-history":[{"count":0,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/148126\/revisions"}],"wp:attachment":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/media?parent=148126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/categories?post=148126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/tags?post=148126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}