为什么附加调试器后进程不会被杀死?
Why process doesn't get killed when debugger is attached?
我在Visual Studio、
中有简单的代码
#include <iostream>
using std::cout;
int main()
{
cout << "Hello World";
return 0;
}
请参考图片。
我设置断点并以调试模式启动。遇到断点后,我 运行 按照 cmd.exe (管理员)中的命令强制终止进程。并显示成功消息。
taskkill /IM debug.exe /F
我仍然可以在任务管理器中看到 Debug.exe。为什么一直没有被杀?有没有其他方法可以终止进程?
请注意我无法使用 pskill
或 SysInternals 的任何其他工具。
在 Windows 所有进程都有句柄。如果您曾经使用过 Win32 API,您可能见过 HINSTANCE
或 HANDLE
。
根据我的阅读和观察,尤其是我发给您的 link:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686714(v=vs.85).aspx 提到
When a process terminates, its kernel object is not destroyed until
all processes that have open handles to the process have released
those handles.
这表明程序将保持 'alive' 直到所有句柄都已释放,就像文件一样。
这只是一个猜测,但当命令提示符显示 "the process has been terminated" 时,这可能意味着该进程已收到 终止信号,预示着它的死亡。
我绝不是这方面的专家,但我认为可以肯定地说(如果没有大师会纠正我的话)你根本无法杀死 Windows 中使用的东西和你的调试器正在使用程序,就像使用文件一样。也尝试向调试器发送终止信号,看看是否有帮助?
TL;DR: 调试器有一个进程句柄(可能是因为它可能是调试器的子进程)因此你不能杀死它直到最后一个手柄是你的。
我在Visual Studio、
中有简单的代码#include <iostream>
using std::cout;
int main()
{
cout << "Hello World";
return 0;
}
请参考图片。
我设置断点并以调试模式启动。遇到断点后,我 运行 按照 cmd.exe (管理员)中的命令强制终止进程。并显示成功消息。
taskkill /IM debug.exe /F
我仍然可以在任务管理器中看到 Debug.exe。为什么一直没有被杀?有没有其他方法可以终止进程?
请注意我无法使用 pskill
或 SysInternals 的任何其他工具。
在 Windows 所有进程都有句柄。如果您曾经使用过 Win32 API,您可能见过 HINSTANCE
或 HANDLE
。
根据我的阅读和观察,尤其是我发给您的 link:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686714(v=vs.85).aspx 提到
When a process terminates, its kernel object is not destroyed until all processes that have open handles to the process have released those handles.
这表明程序将保持 'alive' 直到所有句柄都已释放,就像文件一样。
这只是一个猜测,但当命令提示符显示 "the process has been terminated" 时,这可能意味着该进程已收到 终止信号,预示着它的死亡。
我绝不是这方面的专家,但我认为可以肯定地说(如果没有大师会纠正我的话)你根本无法杀死 Windows 中使用的东西和你的调试器正在使用程序,就像使用文件一样。也尝试向调试器发送终止信号,看看是否有帮助?
TL;DR: 调试器有一个进程句柄(可能是因为它可能是调试器的子进程)因此你不能杀死它直到最后一个手柄是你的。