%processname% (reagiert nicht)
Jeder kennt das Problem, immer dann wenn man möglichst schnell mal eben [=>Murphy’s Law] noch etwas nachschauen möchte, dann wird man sich manchmal mit folgendem Bild konfrontiert sehen:
Was bedeutet “reagiert nicht”/”not responding”?
Dazu muss ich ein wenig ausholen:
<techie_erklär_mode>
Ein Prozess ist letztlich nur ein Container, der Resourcen bereitstellt. Diese Resourcen können z.B. Speicher, Files, … sein.
In einem Prozess arbeiten sog. “Threads”. Diese – letztlich auch eine Form einer Resource – leisten die eigentliche Arbeit innerhalb eines Prozesses und nutzen dabei die Resourcen des eigenen Prozesses [es gibt zwar auch von Prozessen losgelöste Threads, diese sind allerdings eine Sonderform, auf die ich hier nicht eingehe, wer mag kann sich gerne mit Fibern weiterbilden! ], die dem Prozess vom Betriebssystem zur Verfügung gestellt worden ist.
Der sog. Main Thread, oder auch “Thread 0” ist für die Verarbeitung von Window Messages zuständig und nutzt dazu eine Message Queue , in der alle eingehenden Messages zwischengespeichert werden.
Der Main Thread überwacht also die Queue und reagiert auf eingehende Messages. Eine solche Message kann z.B. eine Mausbewegung und/oder Klick sein.
Diese Message Queue hat allerdings eine begrenzte Länge. Wenn also nun der Main Thread blockiert ist – entweder durch einen Live Lock oder einen Dead Lock, wobei meist ein Dead Lock zu finden ist, bei dem der Prozess auf z.B. die Beantwortung eines IO Requests wartet – dann kann diese Message Queue nicht abgearbeitet werden. Wenn nun immer weiter Messages an den Prozess gehen und dadurch irgendwann (was sehr schnell gehen kann) die Message Queue vollgelaufen ist, dann erkennt das Betriebssystem, dass keine weiteren Messages mehr angenommen werden können und reagiert so, dass das Windows ausgegraut wird und in der Titelleiste das “reagiert nicht” angezeigt wird.
</techie_erklär_mode>
Was kann ich gegen einen nicht reagierenden Prozess tun?
Hier habe ich mehrere Möglichkeiten:
Den Prozess mittels Taskmanagers beenden
Einen Debugger an den Prozess attachen und anhand von Symbols & Source die Ursache herausfinden. (dies ist vermutlich das, was am wenigsten häufig durchgeführt wird! Siehe hierzu auch Wait Chain Traversal )
Bei Windows 7 gibt es den sog. “Resource Monitor” (Zum Starten entweder über den Taskmanager->Performance->Resource Monitor oder über direkten Aufruf “perfmon.exe /res” oder über den Performance Monitor)
Wenn man nun den Resource Monitor geöffnet hat, so werden nicht reagierende Prozesse in “rot” angezeigt:
Nun hilft ein beherzter rechts-Klick auf den Prozess und ein weiterer Links-Klick auf “Analyze Wait Chain…”:
um folgende Information zu erhalten:
Anhand dieser Information kann man versuchen die Verklemmung zu beseitigen. Hier können u.a. neben dem Warten auf einen bestimmten Prozess auch blockierte Resourcen (siehe Handles ) aufgezeigt werden. Über dies kann dann der eigentliche Verursacher ausgemacht und entsprechende Maßnahmen eingeleitet werden.
P.S.: in den Screenshots ist Powerpoint zu sehen, nicht weil es “anfällig” dafür ist, sondern weil ich heute selber über das Problem gestolpert bin und so ein schnell verfügbares Repro hatte – sprich dies kann mit JEDEM Prozess passieren!
-Stephanus
X-Post von: [W7][TIP] %processname% (reagiert nicht)