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


30

In questo momento sto cercando di eseguire / eseguire il debug della mia applicazione in Visual Studio, ma non è possibile crearla perché l'ultima istanza di app.vshost.exeè ancora in esecuzione. Quindi, usando Task Manager sto cercando di ucciderlo, ma rimane lì senza alcun segnale di attività.

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

Può, uno sviluppatore collegato al sistema operativo illuminato, provare a spiegare?

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


10
Se avessi avuto solo un nichel per ogni volta che volevo la risposta a questa domanda ...
Steven Oxley

3
Apprezzo le risposte, ma vorrei leggere uno sviluppatore di sistemi operativi che spiega perché un sistema operativo di questa era non può uccidere un processo non core / kernel (o qualunque aggettivo sia appropriato). Ho creduto che dal 386 ci fosse un "ring 0" (o qualcosa di simile) che conferiva privilegi speciali a un codice rispetto ad altri, ho pensato che fosse il modo in cui un processo (OS) ha autorità su altri. Forse mi sbaglio completamente, ma la domanda rimane senza risposta.
Néstor Sánchez A.

Risposte:


21

La causa è in genere un driver che non risponde che ha richieste di I / O non completate in corso.

Vedi il blog di Mark Russinovich Unkillable Processes ( archivio )


Questo succede anche in Linux. Mentre l'architettura x86 ha 4 anelli, ne vengono utilizzati solo due (anello 3 per spazio utenti, anello 0 per kernel). Quindi tutto è in modalità kernel o spazio utente, senza nulla in mezzo. Ma una possibile soluzione alternativa sono i driver in "modalità utente" che dipendono da un piccolo stub in modalità kernel affidabile che chiama semplicemente il codice userspace. Credo che la maggior parte dei driver di stampa e USB in Windows siano questi (i driver grafici erano in Windows 3.1), ma lo spazio utente comporta una riduzione delle prestazioni.
LawrenceC,

L'industria (Intel, AMD, ARM, ecc.) Non potrebbe creare un "meta-ring" per dare finalmente all'utente (a suo rischio) la reale capacità di uccidere un processo e sbarazzarsi di questo problema una volta per sempre ????
Néstor Sánchez A.

16

Un possibile motivo: non è possibile uccidere un'attività collegata a un debugger.

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


3
Come faccio a capire se è collegato un debugger e quale processo è collegato? Perché non sto eseguendo il debug di nulla ma l'attività non morirà, non con il task manager, non quando si interrompe il servizio, non con taskkill /f, non con wmic ... call terminate... continua a dire "errore: il processo X con pid Y non può essere terminato Non esiste un'istanza in esecuzione di questa attività. "
Luc

3

Uno dei motivi sarebbe che non hai il permesso di ucciderlo. Ad esempio, se il processo è in esecuzione come amministratore e sei un utente normale.


3

Apri la pagina Proprietà per il progetto, vai alla scheda Debug e seleziona "Abilita debug di codice non gestito". In alternativa, deseleziona l'opzione per l'utilizzo del processo host.


2

Se l'ultimo app.vshost.exe è ancora in esecuzione, connettiti a quel processo con il debugger.

Dovrebbe essere trovato nel menu in Debug-> AttachToProcess quindi scegliere il processo di sospensione e connettersi ad esso.


2

La mia unica esperienza di sviluppo a livello di sistema operativo è stata alla scuola elementare, ma sospetto che ciò che sta accadendo sia questo (o qualcosa di simile):

Si è verificato un errore durante l'esecuzione dell'ultima istanza che il debugger ha tentato di gestire, ma alcuni altri problemi hanno causato l'errore (forse si è verificata un'asserzione di debug, ma prima di poter fare clic sulla finestra di dialogo per interrompere / riprovare / ignorare, è stata attivata un'altra interruzione , forse a causa di un puntatore nullo). Il risultato, dopo l'interruzione del debug, è stato che il debugger stava ancora aspettando la tua risposta alla prima asserzione di debug, quindi non avrebbe potuto interrompere il processo. Ma poi il debugger è terminato quando hai interrotto il debug (o l'hai fatto?), Trasformando il processo in uno zombi o il suo albero in zombi. Quando hai tentato di uccidere il processo di zombi, si è verificato un errore simile a questo, ma il task manager non te lo 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 decidessi di provare la stessa cosa sul genitore (nel mio caso il genitore era il processo di debugger, msvsmon.exe), fallisce 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 di zombi. Non è possibile collegare un debugger al processo di debug, poiché è già collegato un debugger (zombie) e non è possibile collegare un debugger al debugger (zombie) perché, come Visual Studio ti dirà quando proverai :

Impossibile collegarsi al processo. Un'operazione non è legale nello stato corrente.

Gli zombi sono ancora nella tabella dei processi sufficientemente bene da impedirti di eseguire un'altra istanza tramite il debugger, ma probabilmente potresti avviare un'altra istanza al di fuori dell'IDE.

Questo risolve il problema più specifico di avere VS che crea un processo di zombi. Ma i processi di zombi spesso non muoiono. Bene, spesso su Windows, a volte su Linux, non fino a quando non li spari con un fucile. O è stato un arresto? Ma attenzione all'applicazione accidentale di aggiornamenti di Windows in sospeso.

Mi sono emozionato per alcune delle risposte precedenti che suggerivano di collegarmi con il debugger, ma quanto sopra è il risultato che ho ottenuto. Quindi sto inviando la mia risposta e riavvio per ripulire la tabella dei processi.


Grazie, questa è sicuramente la risposta migliore che corrisponde al mio problema.
Pablo Ariel,

1

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

/programming/49988/really-killing-a-process-in-windows

(Proprio ora ho scoperto che pskill era l'unico di numerosi strumenti che potevano uccidere un processo in esecuzione sotto la sessione di Windows 7 di un utente, dalla sessione di un altro utente (o credenziali, suppongo.)



-1

Se stai usando VS per eseguire il debug del processo e lo uccidi con il task manager, allora VS non riesce a gestirlo bene.

Quindi VS sta ancora eseguendo il debug del processo di destinazione, ma non è possibile premere il processo di arresto in VS. Basta uscire dal VS e vedrai il processo terminare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.