Warum kann Windows manchmal einen Prozess nicht beenden?

30

Im Moment versuche ich, meine Anwendung in Visual Studio auszuführen / zu debuggen, aber sie kann nicht erstellt werden, da die letzte Instanz von app.vshost.exenoch ausgeführt wird. Dann versuche ich mit dem Task-Manager, ihn zu töten, aber er bleibt dort ohne Anzeichen von Aktivität.

Abgesehen von diesem speziellen Fall (möglicherweise ein Visual Studio-Fehler) bin ich sehr gespannt auf die technischen Gründe, warum Windows manchmal einen Prozess nicht beenden kann.

Kann ein aufklärerischer Betriebssystementwickler versuchen, dies zu erklären?

(Und bitte starte keinen Unix / Linux / Mac-Kampf gegen Windows.)

Néstor Sánchez A.
quelle
10
Wenn ich nur für jedes Mal einen Nickel hätte, wollte ich die Antwort auf diese Frage ...
Steven Oxley
3
Ich schätze die Antworten, würde aber gerne einen Betriebssystementwickler lesen, der erklärt, warum ein Betriebssystem dieser Zeit einen Nicht-Kernel / Kernel-Prozess (oder was auch immer für ein Adjektiv angemessen ist) nicht beenden kann. Ich habe geglaubt, dass es seit dem 386 einen "Ring 0" (oder etwas Ähnliches) gibt, der einem Code gegenüber anderen besondere Privilegien verleiht. Ich dachte, dass dies die Art und Weise ist, in der ein (OS) -Prozess die Autorität über andere hat. Vielleicht liege ich völlig falsch, aber die Frage bleibt unbeantwortet.
Néstor Sánchez A.

Antworten:

21

Die Ursache ist normalerweise ein nicht reagierender Treiber, der noch nicht abgeschlossene E / A- Anforderungen verarbeitet.

Siehe Mark Russinovichs Blog-Eintrag Unkillable Processes ( Archiv )

Ian Boyd
quelle
Dies passiert auch unter Linux. Während die x86-Architektur 4 Ringe aufweist, werden nur zwei davon verwendet (Ring 3 für den Benutzerbereich, Ring 0 für den Kernel). Also ist alles entweder Kernel-Modus oder Userspace, mit nichts dazwischen. Eine mögliche Problemumgehung sind jedoch "Benutzermodus" -Treiber, die von einem kleinen zuverlässigen Kernelmodus-Stub abhängen, der lediglich Benutzerbereichscode aufruft. Ich glaube, die meisten Druck- und USB-Treiber in Windows sind dies (Grafiktreiber waren früher in Windows 3.1), aber der Benutzerbereich ist mit Leistungseinbußen verbunden.
LawrenceC
Könnte die Industrie (Intel, AMD, ARM usw.) keinen "Meta-Ring" erstellen, um dem Benutzer (auf eigenes Risiko) endlich die echte Fähigkeit zu geben, einen Prozess zu beenden und dieses Problem ein für alle Mal loszuwerden ????
Néstor Sánchez A.
16

Ein möglicher Grund: Sie können eine Aufgabe, die an einen Debugger angehängt ist, nicht beenden.

Die Aufgabe kann nur vom Debugger aus gestoppt werden.

Harrymc
quelle
3
Wie finde ich heraus, ob ein Debugger angehängt ist und an welchen Prozess er angehängt ist? Da ich nichts debugge, aber die Task nicht abstürzt, nicht mit dem Task-Manager, nicht beim Beenden des Dienstes, nicht mit taskkill /f, nicht mit wmic ... call terminate... wird immer wieder "Fehler" angezeigt: Der Prozess X mit PID Y konnte nicht beendet werden Es gibt keine laufende Instanz dieser Aufgabe. "
Luc
3

Ein Grund wäre, dass Sie nicht die Erlaubnis haben, es zu töten. ZB wenn der Prozess als Administrator ausgeführt wird und Sie ein normaler Benutzer sind.

Brian Lyttle
quelle
3

Öffnen Sie die Seite " Eigenschaften " für das Projekt, wechseln Sie zur Registerkarte "Debuggen" und aktivieren Sie "Debuggen von nicht verwaltetem Code aktivieren". Oder deaktivieren Sie die Option zur Verwendung des Host-Prozesses.

Tadjou
quelle
2

Wenn die letzte Datei app.vshost.exe noch ausgeführt wird, stellen Sie einfach mit dem Debugger eine Verbindung zu diesem Prozess her.

Sollte im Menü unter Debug-> AttachToProcess zu finden sein, dann wählen Sie den Hängeprozess und verbinden Sie sich damit.

Oliver Friedrich
quelle
2

Meine einzige Erfahrung in der Entwicklung auf OS-Ebene war in der Grundschule, aber ich vermute, dass Folgendes (oder etwas Ähnliches) passiert:

Beim Ausführen der letzten Instanz, die der Debugger zu behandeln versuchte, ist ein Fehler aufgetreten, der jedoch durch ein anderes Problem verursacht wurde (möglicherweise wurde eine Debug-Zusicherung festgestellt, aber bevor Sie auf das Dialogfeld "Abbrechen / Wiederholen / Ignorieren" klicken konnten, wurde eine weitere Unterbrechung ausgelöst , möglicherweise aufgrund eines Nullzeigers). Nachdem Sie das Debuggen beendet haben, wartete der Debugger immer noch auf Ihre Antwort auf die erste Debug-Zusicherung, sodass der Prozess nicht beendet werden konnte. Aber dann wurde der Debugger beendet, als Sie aufhörten zu debuggen (oder taten es?) Und den Prozess in einen Zombie oder seinen Baum in Zombies verwandelten. Beim Versuch, den Zombie-Prozess zu beenden, ist ein ähnlicher Fehler aufgetreten, der Ihnen vom Task-Manager jedoch nicht mitgeteilt wurde:

C:\Windows\system32>taskkill /pid 9564 /f /t
ERROR: The process with PID 9564 (child process of PID 22520) could not be
terminated.
Reason: There is no running instance of the task.

Sollten Sie sich dazu entschließen, dasselbe für das übergeordnete Element zu versuchen (in meinem Fall war das übergeordnete Element der Debuggerprozess msvsmon.exe), schlägt dies auf die gleiche Weise fehl:

C:\Windows\system32>taskkill /pid 22520 /f /t
ERROR: The process with PID 9564 (child process of PID 22520) could not be
terminated.
Reason: There is no running instance of the task.
ERROR: The process with PID 22520 (child process of PID 13964) could not be
terminated.
Reason: There is no running instance of the task.

Das übergeordnete Element wurde von der IDE gestartet, aber die IDE hat die Nabelschnur durchtrennt, sodass Sie jetzt zwei Zombie-Prozesse haben. Sie können dem Prozess, den Sie debuggen, keinen Debugger hinzufügen, da bereits ein (Zombie-) Debugger vorhanden ist, und Sie können dem (Zombie-) Debugger keinen Debugger hinzufügen, da dies in Visual Studio angezeigt wird, wenn Sie es versuchen :

Es kann keine Verbindung zum Prozess hergestellt werden. Eine Operation ist im gegenwärtigen Zustand nicht legal.

Die Zombies befinden sich immer noch in der Prozesstabelle, sodass Sie keine weitere Instanz über den Debugger ausführen können. Möglicherweise können Sie jedoch auch eine andere Instanz außerhalb der IDE starten.

Dies behebt das spezifischere Problem, dass VS einen Zombie-Prozess erstellt. Aber Zombie-Prozesse sterben oft nicht. Nun, oft unter Windows, manchmal unter Linux, bis Sie sie mit einer Schrotflinte abschießen. Oder war das eine Abschaltung? Achten Sie jedoch auf die versehentliche Anwendung ausstehender Windows-Updates.

Ich freute mich über einige der früheren Antworten, die das Anhängen des Debuggers nahe legten, aber das obige ist das Ergebnis, das ich erhielt. Also sende ich meine Antwort und starte neu, um die Prozesstabelle zu bereinigen.

hlongmore
quelle
Danke, das ist mit Sicherheit die beste Antwort, die zu meinem Problem passt.
Pablo Ariel
1

Vielleicht könnte eine Prüfung einiger der hier genannten Tools zu Antworten führen?

https://stackoverflow.com/questions/49988/really-killing-a-process-in-windows

(Im Moment habe ich festgestellt, dass pskill das einzige von mehreren Tools ist, mit dem ein Prozess, der unter der Windows 7-Sitzung eines Benutzers ausgeführt wird, von der Sitzung eines anderen Benutzers (oder den Anmeldeinformationen, nehme ich an) beendet werden kann.)

r_alex_hall
quelle
-1

Sie können!

Mit ProcessHacker (Rechtsklick auf den Prozess) -> Terminator.

Valmond
quelle
-1

Wenn Sie VS zum Debuggen verwenden und es mit dem Task-Manager beenden, kann VS nicht gut damit umgehen.

VS debuggt also immer noch den Zielprozess, aber Sie können nicht einfach auf Prozess stoppen in VS klicken. Beenden Sie einfach Ihren VS und Sie werden sehen, wie Ihr Prozess beendet wird.

VictorV
quelle