Почему иногда Windows не может убить процесс?


30

Сейчас я пытаюсь запустить / отладить мое приложение в Visual Studio, но оно не может его создать, потому что последний экземпляр app.vshost.exeвсе еще работает. Затем с помощью диспетчера задач я пытаюсь убить его, но он остается там без сигнала активности.

Помимо этого конкретного случая (возможно, ошибки в Visual Studio), мне очень любопытны технические причины, по которым иногда Windows не может завершить процесс?

Может, опытный разработчик ОС, пожалуйста, попытайтесь объяснить?

(И, пожалуйста, не начинайте битву Unix / Linux / Mac против Windows.)


10
Если бы у меня был никель каждый раз, когда я хотел получить ответ на этот вопрос ...
Стивен Оксли

3
Я ценю ответы, но я хотел бы прочитать разработчика операционных систем, объясняющего, почему операционная система этой эры не может убить процесс без ядра / ядра (или любого прилагательного, который подходит). Я верил, что с 386 года существует «кольцо 0» (или что-то похожее), дающее особые привилегии одному коду над другим, я думал, что именно так (ОС) процесс имеет власть над другими. Может быть, я совершенно не прав, но вопрос остается без ответа.
Нестор Санчес А.

Ответы:


21

Причиной обычно является не отвечающий драйвер, который имеет незавершенные запросы ввода-вывода .

См. Запись в блоге Марка Руссиновича « Неубиваемые процессы» ( архив ).


Это происходит и в Linux. Хотя архитектура x86 имеет 4 кольца, используется только два из них (кольцо 3 для пространства пользователя, кольцо 0 для ядра). Так что все либо в режиме ядра, либо в пространстве пользователя, между которыми ничего нет. Но возможный обходной путь - это драйверы «пользовательского режима», которые зависят от небольшой надежной заглушки режима ядра, которая просто вызывает код пользовательского пространства. Я полагаю, что большинство драйверов для печати и USB в Windows таковы (графические драйверы использовались в Windows 3.1), но пользовательское пространство влечет за собой снижение производительности.
LawrenceC

Разве индустрия (Intel, AMD, ARM и т. Д.) Не может создать «мета-кольцо», чтобы наконец предоставить пользователю (на свой страх и риск) реальную возможность убить процесс и избавиться от этой проблемы раз и навсегда ????
Нестор Санчес А.

16

Одна из возможных причин: вы не можете убить задачу, привязанную к отладчику.

Единственный способ остановить задачу - от самого отладчика.


3
Как выяснить, подключен ли отладчик и какой процесс подключен? Потому что я ничего не отлаживаю, но задача не умирает, ни с помощью диспетчера задач, ни при остановке службы, ни с помощью taskkill /f, не с wmic ... call terminate... он продолжает говорить "ошибка: процесс X с pid Y не может быть завершен . Нет запущенного экземпляра этой задачи. "
Люк

3

Одной из причин будет то, что у вас нет разрешения убить его. Например, если процесс запущен от имени администратора, а вы обычный пользователь.


3

Откройте страницу « Свойства» для проекта, перейдите на вкладку « Отладка » и установите флажок «Включить отладку неуправляемого кода». Или снимите флажок для использования процесса хоста.


2

Если последний app.vshost.exe все еще работает, просто подключитесь к этому процессу с помощью отладчика.

Должен быть найден в меню под Debug-> AttachToProcess, затем выберите процесс зависания и подключитесь к нему.


2

Мой единственный опыт разработки на уровне ОС был в аспирантуре, но я подозреваю, что происходит (или что-то подобное):

Произошла ошибка во время работы последнего экземпляра, который отладчик пытался обработать, но некоторые другие проблемы привели к сбою (возможно, возникло отладочное утверждение, но перед тем, как вы нажали на диалоговое окно, чтобы прервать / повторить / игнорировать, произошел другой разрыв , может быть из-за нулевого указателя). В результате после того, как вы прекратили отладку, отладчик все еще ждал вашего ответа на первое утверждение отладки, поэтому он не позволил завершить процесс. Но затем отладчик завершился, когда вы прекратили отладку (или сделали это?), Превратив процесс в зомби или его дерево в зомби. Когда вы пытались убить процесс зомби, произошла ошибка, похожая на эту, но менеджер задач не сказал вам об этом:

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.

Если вы решите попробовать то же самое на родителе (в моем случае родителем был процесс отладчика, msvsmon.exe), он завершится неудачно так же:

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.

Родитель был запущен IDE, но IDE перерезал пуповину, так что теперь у вас есть два процесса зомби. Вы не можете присоединить отладчик к процессу, который вы отлаживали, потому что к нему уже подключен (зомби) отладчик, и вы не можете присоединить отладчик к (зомби) отладчику, потому что, как Visual Studio скажет вам, когда вы попытаетесь :

Невозможно присоединиться к процессу. Операция не является законной в текущем состоянии.

Зомби все еще находятся в таблице процессов достаточно хорошо, чтобы помешать запуску другого экземпляра через отладчик, но вы, вероятно, вполне могли бы запустить другой экземпляр за пределами IDE.

Это решает более конкретную проблему наличия VS создать процесс зомби. Но процессы зомби часто не умирают. Ну, часто в Windows, иногда в Linux, пока вы не стреляете в них из дробовика. Или это было отключение? Но остерегайтесь случайного применения ожидающих обновлений Windows.

Я был взволнован некоторыми из более ранних ответов, которые предлагали присоединиться к отладчику, но вышеизложенный результат - мой результат. Поэтому я отправляю свой ответ и перезагружаюсь, чтобы очистить таблицу процессов.


Спасибо, это, безусловно, лучший ответ, который соответствует моей проблеме.
Пабло Ариэль

1

Возможно, проверка некоторых из приведенных здесь инструментов может привести к ответам?

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

(Только сейчас я обнаружил, что pskill был единственным из нескольких инструментов, которые могли убить процесс, запущенный под сеансом Windows 7 одного пользователя, из сеанса другого пользователя (или, я полагаю, учетных данных).


-1

Вы можете!

Использование ProcessHacker (щелкните правой кнопкой мыши по процессу) -> Терминатор.


-1

Если вы используете VS для отладки процесса, и вы убиваете его с помощью диспетчера задач. Тогда VS не может справиться с этим хорошо.

Таким образом, VS все еще отлаживает целевой процесс, но вы не можете просто нажать кнопку остановки процесса в VS. Просто выйдите из VS, и вы увидите выход из процесса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.