29

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

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

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

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

9 ответов9

20

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

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

15

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

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

3

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

3

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

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.

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

2

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

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

1

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

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

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

-1

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

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

-1

Вы можете!

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .