[W7][TIP] %processname% (reagiert nicht)

Jeder kennt das Problem, immer dann wenn man möglichst schnell mal eben [=>Murphy’s Law, nicht zu verwechseln mit Murphy’s Law Zwinkerndes Smiley] noch etwas nachschauen möchte, dann wird man sich manchmal mit folgendem Bild konfrontiert sehen:

image

 

Was bedeutet “reagiert nicht”/”not responding”?

Dazu muss ich ein wenig ausholen:

<techie_erklär_mode>
Ein Prozess ist letztlich nur ein Container, der Ressourcen bereitstellt. Diese Ressourcen können z.B. Speicher, Files, … sein.

In einem Prozess arbeiten sog. “Threads”. Diese – letztlich auch eine Form einer Ressource – leisten die eigentliche Arbeit innerhalb eines Prozesses und nutzen dabei die Ressourcen 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! Zwinkerndes Smiley ], 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:

  1. Den Prozess mittels Taskmanagers beenden

  2. 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! Zwinkerndes Smiley Siehe hierzu auch Wait Chain Traversal )

  3. Bei Windows 7 gibt es den sog. “Resource Monitor” (Zum Starten entweder über den Taskmanager->Performance->Ressource Monitor oder über direkten Aufruf “perfmon.exe /res” oder über den Performance Monitor)
    imageimage

    Wenn man nun den Resource Monitor geöffnet hat, so werden nicht reagierende Prozesse in “rot” angezeigt:
    image
    Nun hilft ein beherzter rechts-Klick auf den Prozess und ein weiterer Links-Klick auf “Analyze Wait Chain…”:
    image
    um folgende Information zu erhalten:

    image
    Anhand dieser Information kann man versuchen die Verklemmung zu beseitigen. Hier können u.a. neben dem Warten auf einen bestimmten Prozess auch blockierte Ressourcen (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!

 

Manchmal ist es an der Zeit Platz für Neues zu machen.

Bis zum nächsten Post

 

Stephanus

 

Resource Availability Troubleshooting Getting Started Guide