Nés*_* A. 33 windows kill visual-studio process
现在我正在尝试在 Visual Studio 中运行/调试我的应用程序,但它无法创建它,因为 的最后一个实例app.vshost.exe仍在运行。然后,通过使用任务管理器我试图杀死它,但它只是留在那里没有活动信号。
除了那个特殊情况(可能是 Visual Studio 错误),我很好奇为什么有时 Windows 无法终止进程的技术原因?
能不能请一位有经验的OS相关开发者解释一下?
(并且请不要开始与 Windows 的 Unix/Linux/Mac 之战。)
har*_*ymc 18
一个可能的原因:您无法终止附加到调试器的任务。
停止任务的唯一方法是从调试器本身。
小智 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 更新。
我对一些建议附加调试器的早期答案感到兴奋,但上面是我得到的结果。所以我正在提交我的答案并重新启动以清理进程表。