为什么在附加调试器时进程没有被杀死?

时间:2017-10-27 11:47:31

标签: debugging process taskkill

我在Visual Studio中有简单的代码,

#include <iostream>

using std::cout;

int main()
{
    cout << "Hello World";
    return 0;
}

请参考图片。

我放置断点并以调试模式启动。在断点命中后,我在cmd.exe(Administrator)中运行以下命令来强制终止进程。它显示了成功的信息。

taskkill /IM debug.exe /F

仍然,我可以在任务管理器中看到Debug.exe。为什么没有被杀?有没有其他方法来杀死这个过程?

请注意我不能使用pskill或SysInternals的任何其他工具。

enter image description here

1 个答案:

答案 0 :(得分:1)

在Windows上,所有进程都有句柄。如果您曾经使用过Win32 API,则可能会看到HINSTANCEHANDLE

根据我所阅读的内容以及我观察到的内容,特别是我发送给您的链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686714(v=vs.85).aspx它提到了

  

当进程终止时,其内核对象直到被破坏   已释放具有该进程的打开句柄的所有进程   那些把柄。

这表明该计划将保持“活着”状态。直到所有句柄都被释放,就像文件一样。

这只是一个猜测,但是当命令提示写入&#34时,该过程已经终止&#34;这可能意味着该过程已被发送终止信号,预示着其死亡。

我绝不是这方面的专家,但我认为可以安全地说(如果没有大师能够纠正我的话),你根本无法杀死那些&# #39;正在Windows中使用,调试器正在使用您的程序,就像文件一样。尝试向调试器发送一个kill信号,看看是否有帮助?

TL; DR:调试器有一个处理过程(可能是因为它可能是调试器的子进程)因此你无法杀死它直到最后一个句柄是你的。