目前,我正在尝试在Visual Studio中运行/调试应用程序,但由于的最后一个实例app.vshost.exe
仍在运行,因此无法创建它。然后,通过使用任务管理器,我试图将其杀死,但它仍然保留在那里而没有任何活动信号。
除了这种特殊情况(可能是Visual Studio错误)之外,我对有时Windows无法终止进程的技术原因非常好奇。
能够与OS相关的开发者,请尝试解释一下吗?
(并且请不要针对Windows发起Unix / Linux / Mac战争。)
目前,我正在尝试在Visual Studio中运行/调试应用程序,但由于的最后一个实例app.vshost.exe
仍在运行,因此无法创建它。然后,通过使用任务管理器,我试图将其杀死,但它仍然保留在那里而没有任何活动信号。
除了这种特殊情况(可能是Visual Studio错误)之外,我对有时Windows无法终止进程的技术原因非常好奇。
能够与OS相关的开发者,请尝试解释一下吗?
(并且请不要针对Windows发起Unix / Linux / Mac战争。)
Answers:
原因通常是一些未响应的驱动程序未完成 I / O请求。
参见Mark Russinovich的博客文章Unkillable Processes (存档)
如果最后一个app.vshost.exe仍在运行,请使用调试器连接到该进程。
应该在Debug-> AttachToProcess下的菜单中找到,然后选择挂起的进程并连接到它。
我唯一的OS级开发经验是在研究生院学习的,但是我怀疑发生了什么(或类似的事情):
运行调试器尝试处理的最后一个实例时发生错误,但是其他一些问题导致该失败(可能是遇到调试断言,但是在单击对话框以中止/重试/忽略之前,触发了另一个中断,可能是由于空指针造成的)。在停止调试之后,结果是调试器仍在等待您对第一个调试断言的响应,因此它不会使进程终止。但是,当您停止调试(或这样做?)时,调试器终止,将进程变成僵尸,或将其树变成僵尸。当您尝试杀死僵尸进程时,发生了类似于此的错误,但是任务管理器没有告诉您有关它的信息:
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上,直到您用gun弹枪射击它们。还是那次关机?但是要当心未决的Windows更新应用程序。
我对建议附加到调试器的一些较早的答案感到很兴奋,但是以上是我得到的结果。因此,我要提交答案并重新启动以清理进程表。
也许对这里引用的一些工具进行检查可以得出答案?
https://stackoverflow.com/questions/49988/really-killing-a-process-in-windows
(现在,我发现pskill是可以杀死一个用户的Windows 7会话下运行的进程的另一种工具,它是另一用户的会话(我想是凭据)。
您可以!
使用ProcessHacker(右键单击进程)->终结器。