Perché a volte Windows non può uccidere un process?

Adesso sto cercando di eseguire / debug la mia applicazione in Visual Studio, ma non è ansible creare perché l'ultima istanza app.vshost.exe è ancora in esecuzione. Poi, utilizzando il Task Manager sto cercando di ucciderlo, ma rimane solo lì senza alcun segnale di attività.

Al di là di quel particolare caso (forse un bug di Visual Studio), sono molto curioso dei motivi tecnici per cui a volte Windows non può uccidere un process?

Può, un sviluppatore legato al sistema operativo OS, prova a spiegare?

(E per favore non avviare una battaglia Unix / Linux / Mac contro Windows).

La causa è di solito alcuni driver irresponsivi che hanno in corso le richieste di I / O incompiute. http://blogs.technet.com/markrussinovich/archive/2005/08/17/unkillable-processes.aspx

Una ragione ansible: non è ansible uccidere un'attività che è collegata a un debugger.

L'unico modo per arrestare l'attività è dal debugger stesso.

Una ragione sarebbe che non hai il permesso di ucciderlo. Ad esempio se il process è in esecuzione come amministratore e sei un utente normale.

Aprire la pagina Proprietà per il progetto, andare alla scheda Debug e select "Abilita il debug di codice non gestito". Oppure, deseleziona l'opzione per l'utilizzo del process host.

Se l'ultima app.vshost.exe è ancora in esecuzione, basta collegarsi a quel process con il debugger.

Dovrebbe essere trovato nel menu sotto Debug-> AttachToProcess, quindi scegliere il process appendente e connettersi ad esso.

Forse un esame di alcuni strumenti qui citati potrebbe portre a risposte?

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

(Adesso ho scoperto che pskill era l'unico di molti strumenti che potrebbero uccidere un process in esecuzione nella session di Windows 7 di un utente, da una session di altri utenti (o credenziali, suppongo).

La mia sola esperienza di sviluppo a livello di OS era nella scuola di laurea, ma sospetto che ciò che sta accadendo è questo (o qualcosa di simile):

Si è verificato un errore durante l'esecuzione dell'ultima istanza che il debugger ha tentato di gestire, ma un altro problema ha causato il fallimento (forse è stata riscontrata un'asserzione di debug, ma prima di poter fare clic sulla window di dialogo Abort / Riprova / Ignora, è stata triggersta un'altra interruzione , forse dovuto ad un puntatore nullo). Il risultato, dopo aver interrotto il debug, è che il debugger stava ancora aspettando la tua risposta alla prima affermazione di debug, quindi non consentirebbe che il process venisse terminato. Ma poi il debugger è terminato quando si è arrestato il debug (o lo ha fatto?), Trasformando il process in un zombo, o la sua struttura in zombie. Quando hai cercato di uccidere il process zombie, è accaduto un errore simile a questo, ma il responsabile di task non ti ha detto:

 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. 

Se si decide di provare la stessa cosa sul genitore (nel mio caso il genitore è stato il process di debugger, msvsmon.exe), esso non funziona allo stesso modo:

 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. 

Il genitore è stato avviato dall'IDE, ma l'IDE ha tagliato il cordone ombelicale, quindi ora hai due processi zombi. Non è ansible albind un debugger al process in cui è stato eseguito il debug, perché è già presente un debugger (zombie) e non è ansible albind un debugger al debugger (zombie) perché, come Visual Studio vi dirà quando provate :

Imansible collegarsi al process. Un'operazione non è legale nello stato attuale.

Gli zombie sono ancora nella tabella di process abbastanza bene per impedire l'esecuzione di un'altra istanza tramite il debugger, ma probabilmente potrebbe iniziare un'altra istanza al di fuori dell'IDE.

Questo affronta il problema più specifico di avere VS creare un process zombie. Ma i processi zombie spesso non muoiono. Beh, spesso su Windows, a volte su Linux, finché non li spari con un fucile. O è stato un arresto? Ma attenzione all'applicazione accidentale degli aggiornamenti in attesa di Windows.

Sono entusiasta di alcune delle risposte precedenti che hanno suggerito l'attaccamento con il debugger, ma il risultato è il risultato che ho ottenuto. Quindi sto inviando la mia risposta e riavvio per pulire la tabella di process.

Puoi!

Utilizzando ProcessHacker (fare clic destro sul process) -> Terminator.