为什么有时 Windows 无法终止进程?

为什么有时 Windows 无法终止进程?

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

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

有经验的操作系统相关开发人员能否尝试解释一下?

(并且请不要发起针对 Windows 的 Unix/Linux/Mac 之争。)

答案1

原因通常是一些没有响应的驱动程序未完成输入/输出正在进行的请求。

请参阅 Mark Russinovich 的博客文章无法终止的进程 档案

答案2

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

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

答案3

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

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

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 更新。

我对之前一些建议使用调试器的答案感到很兴奋,但以上是我得到的结果。所以我提交了我的答案并重新启动以清除进程表。

答案4

打开特性项目的页面,转到调试选项卡,勾选“启用非托管代码调试”。或者,取消勾选使用主机进程的选项。

相关内容