Чому іноді 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 все ще працює, просто підключіться до цього процесу за допомогою налагоджувача.

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


2

Мій єдиний досвід розробки на рівні ОС був у школі, але я підозрюю, що це таке (або щось подібне):

Під час запуску останнього примірника, з яким налагоджувач намагався впоратися, сталася помилка, але якась інша проблема призвела до того, що не вдалося (можливо, виникло твердження про налагодження, але перш ніж ви могли натиснути на діалогове вікно Abort / Retry / Ignore, інший перерву було запущено , можливо, через нульовий покажчик). Результатом, після того як ви припинили налагодження, було те, що налагоджувач все ще чекав вашої відповіді на перше твердження про налагодження, тому він не дозволив процесу закінчитися. Але потім налагоджувач припинився, коли ви припинили налагодження (чи зробили це?), Перетворивши процес у зомбі, або його дерево на зомбі. Коли ви намагалися вбити процес зомбі, сталася помилка, подібна до цієї, але менеджер завдань не повідомив вам про це:

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

Можливо, вивчення деяких з наведених тут інструментів може призвести до відповідей?

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

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



-1

Якщо ви використовуєте VS для налагодження процесу, і ви вбиваєте його з диспетчером завдань. Тоді VS не може з цим добре впоратися.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.