¿Por qué a veces Windows no puede matar un proceso?


30

En este momento estoy tratando de ejecutar / depurar mi aplicación en Visual Studio, pero no puede crearla porque la última instancia del app.vshost.exetodavía se está ejecutando. Luego, al usar el Administrador de tareas, intento matarlo, pero simplemente permanece allí sin señal de actividad.

Más allá de ese caso en particular (tal vez un error de Visual Studio), tengo mucha curiosidad sobre las razones técnicas por las que a veces Windows no puede matar un proceso.

¿Puede un desarrollador iluminado relacionado con el SO intentar explicar?

(Y, por favor, no comience una batalla de Unix / Linux / Mac contra Windows).


10
Si solo tuviera un centavo por cada vez que quisiera la respuesta a esta pregunta ...
Steven Oxley

3
Agradezco las respuestas, pero me gustaría leer un desarrollador de sistemas operativos que explique por qué un sistema operativo de esta era no puede matar un proceso no núcleo / núcleo (o cualquier adjetivo apropiado). Creí que desde el 386 había un "anillo 0" (o algo similar) que otorgaba privilegios especiales a un código sobre otro, pensé que esa era la forma en que un proceso (OS) tenía autoridad sobre otros. Tal vez estoy completamente equivocado, pero la pregunta sigue sin respuesta.
Néstor Sánchez A.

Respuestas:


21

La causa suele ser un controlador que no responde y que tiene solicitudes de E / S sin terminar en curso.

Ver la entrada del blog de Mark Russinovich Procesos inquebrantables ( archivo )


Esto también sucede en Linux. Mientras que la arquitectura x86 tiene 4 anillos, solo se usan dos de ellos (anillo 3 para el espacio de usuario, anillo 0 para el núcleo). Entonces, todo es modo kernel o espacio de usuario, sin nada en el medio. Pero, una posible solución son los controladores de "modo de usuario" que dependen de un pequeño código auxiliar confiable de modo de núcleo que simplemente llama al código de espacio de usuario. Creo que la mayoría de los controladores de impresión y USB en Windows son esto (los controladores de gráficos solían estar en Windows 3.1), pero el espacio de usuario conlleva una penalización de rendimiento.
LawrenceC

¿No podría la industria (Intel, AMD, ARM, etc.) crear un "meta-anillo" para finalmente darle al usuario (bajo su propio riesgo) la capacidad real de matar un proceso y deshacerse de este problema de una vez y para siempre ????
Néstor Sánchez A.

16

Una posible razón: no puede matar una tarea que está adjunta a un depurador.

La única forma de detener la tarea es desde el depurador.


3
¿Cómo puedo determinar si un depurador está conectado y qué proceso está conectado? Debido a que no estoy depurando nada, pero la tarea no morirá, ni con el administrador de tareas, ni al detener el servicio, ni con taskkill /f, ni con wmic ... call terminate... sigue diciendo "error: el proceso X con pid Y no se pudo terminar . No hay una instancia en ejecución de esta tarea ".
Luc

3

Una razón sería que no tienes permiso para matarlo. Por ejemplo, si el proceso se ejecuta como administrador y usted es un usuario normal.


3

Abra la página Propiedades para el proyecto, vaya a la pestaña Depuración y marque "Habilitar depuración de código no administrado". O, desmarque la opción para usar el proceso de host.


2

Si el último archivo app.vshost.exe aún se está ejecutando, solo conéctese a ese proceso con el depurador.

Debería encontrarse en el menú en Debug-> AttachToProcess, luego elija el proceso de colgar y conéctese a él.


2

Mi única experiencia de desarrollo a nivel de SO fue en la escuela de posgrado, pero sospecho que lo que está sucediendo es esto (o algo similar):

Se produjo un error al ejecutar la última instancia que el depurador trató de manejar, pero otro problema causó que fallara (tal vez se encontró una afirmación de depuración, pero antes de que pudiera hacer clic en el cuadro de diálogo para Anular / Reintentar / Ignorar, se activó otra interrupción , tal vez debido a un puntero nulo). El resultado, después de que detuvo la depuración, fue que el depurador todavía estaba esperando su respuesta a la primera afirmación de depuración, por lo que no permitiría que el proceso terminara. Pero luego el depurador finalizó cuando dejaste de depurar (¿o lo hiciste?), Convirtiendo el proceso en un zombie, o su árbol en zombies. Cuando trataste de matar el proceso zombie, ocurrió un error similar a este, pero el administrador de tareas no te lo contó:

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.

Si decide intentar lo mismo en el padre (en mi caso, el padre fue el proceso del depurador, msvsmon.exe), falla de la misma manera:

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.

El IDE inició al padre, pero el IDE cortó el cordón umbilical, por lo que ahora tiene dos procesos zombie. No puede adjuntar un depurador al proceso que estaba depurando, porque ya hay un depurador (zombie) conectado, y no puede adjuntar un depurador al depurador (zombie) porque, como Visual Studio le dirá cuando intente :

No se puede adjuntar al proceso. Una operación no es legal en el estado actual.

Los zombis todavía están en la tabla de procesos lo suficientemente bien como para evitar que ejecutes otra instancia a través del depurador, pero probablemente puedas iniciar otra instancia fuera del IDE.

Esto aborda el problema más específico de hacer que VS cree un proceso zombie. Pero, los procesos zombis a menudo no mueren. Bueno, a menudo en Windows, a veces en Linux, no hasta que les disparas con una escopeta. ¿O fue un cierre? Pero tenga cuidado con la aplicación accidental de actualizaciones pendientes de Windows.

Me emocioné con algunas de las respuestas anteriores que sugerían asociarme con el depurador, pero lo anterior es el resultado que obtuve. Así que estoy enviando mi respuesta y reiniciando para limpiar la tabla de procesos.


Gracias, esta es ciertamente la mejor respuesta que coincide con mi problema.
Pablo Ariel

1

¿Quizás un examen de algunas de las herramientas citadas aquí podría dar lugar a respuestas?

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

(Justo ahora descubrí que pskill era la única de varias herramientas que podían matar un proceso que se ejecutaba bajo la sesión de Windows 7 de un usuario, desde la sesión de otro usuario (o credenciales, supongo).



-1

Si está utilizando VS para depurar el proceso y lo elimina con el administrador de tareas, entonces VS no puede manejarlo bien.

Por lo tanto, VS todavía está depurando el proceso de destino, pero no puede simplemente presionar detener proceso en VS.Solo salga de su VS y verá que su proceso se cierra.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.