为什么有时 Windows 无法杀死进程?

Nés*_* A. 33 windows kill visual-studio process

现在我正在尝试在 Visual Studio 中运行/调试我的应用程序,但它无法创建它,因为 的最后一个实例app.vshost.exe仍在运行。然后,通过使用任务管理器我试图杀死它,但它只是留在那里没有活动信号。

除了那个特殊情况(可能是 Visual Studio 错误),我很好奇为什么有时 Windows 无法终止进程的技术原因?

能不能请一位有经验的OS相关开发者解释一下?

(并且请不要开始与 Windows 的 Unix/Linux/Mac 之战。)

小智 22

原因通常是一些无响应的驱动程序有未完成的I/O请求正在进行。

请参阅 Mark Russinovich 的博客文章Unkillable Processes 存档


har*_*ymc 18

一个可能的原因:您无法终止附加到调试器的任务。

停止任务的唯一方法是从调试器本身。

  • 如何确定是否附加了调试器以及附加了哪个进程?因为我没有调试任何东西但是任务不会死,不是用任务管理器,不是在停止服务时,不是用`taskkill /f`,不是用`wmic ... call terminate`......它一直在说“错误:无法终止具有 pid Y 的进程 X。此任务没有正在运行的实例。” (5认同)

小智 5

我唯一的操作系统级开发经验是在研究生院,但我怀疑正在发生的事情是这样的(或类似的事情):

运行调试器尝试处理的最后一个实例时发生错误,但其他一些问题导致失败(可能遇到了调试断言,但在您单击对话框中止/重试/忽略之前,触发了另一个中断,可能是由于空指针)。停止调试后的结果是,调试器仍在等待您对第一个调试断言的响应,因此它不会让进程终止。但是,当您停止调试(或者确实如此?)时,调试器终止,将进程变成僵尸,或其树变成僵尸。当您尝试杀死僵尸进程时,发生了类似的错误,但任务管理器没有告诉您:

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.
Run Code Online (Sandbox Code Playgroud)

如果您决定在父进程上尝试相同的操作(在我的例子中,父进程是调试器进程 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.
Run Code Online (Sandbox Code Playgroud)

父进程是由 IDE 启动的,但 IDE 切断了脐带,所以现在有两个僵尸进程。您无法将调试器附加到您正在调试的进程,因为已经附加了一个(僵尸)调试器,并且您无法将调试器附加到(僵尸)调试器,因为,当您尝试时,Visual Studio 会告诉您:

无法附加到进程。操作在当前状态下不合法。

僵尸进程仍然在进程表中,足以阻止您通过调试器运行另一个实例,但您可能可以在 IDE 之外启动另一个实例。

这解决了 VS 创建僵尸进程的更具体问题。但是,僵尸进程通常不会死亡。嗯,通常在 Windows 上,有时在 Linux 上,直到你用霰弹枪射击它们。或者说是停工了?但请注意意外应用待处理的 Windows 更新。

我对一些建议附加调试器的早期答案感到兴奋,但上面是我得到的结果。所以我正在提交我的答案并重新启动以清理进程表。


Bri*_*tle 3

原因之一是您无权杀死它。例如,如果进程以管理员身份运行而您是普通用户。