使用Windbg收集句柄
我正在使用Windbg sdk编写自己的调试器。调试器能够收集已调试应用程序分配的所有句柄,以避免句柄泄漏。这是我的密码:使用Windbg收集句柄,windbg,handle,Windbg,Handle,我正在使用Windbg sdk编写自己的调试器。调试器能够收集已调试应用程序分配的所有句柄,以避免句柄泄漏。这是我的密码: void zAdvancedDebugger::debugProc(){ // Creating interfaces including m_dbgClient, m_dbgControl if(!createInterfaces()){ printf("Failed to create debugging interfaces\r\n")
void zAdvancedDebugger::debugProc(){
// Creating interfaces including m_dbgClient, m_dbgControl
if(!createInterfaces()){
printf("Failed to create debugging interfaces\r\n");
return;
}
std::string strRealCmdLine="\"" + app + "\" " + args;
// Every thing's set up so start the app.
if (( m_dbgClient->CreateProcess(0, (PSTR)strRealCmdLine.c_str(), DEBUG_PROCESS )) != S_OK)
return ;
// event loop
while(true){
if(m_dbgControl->WaitForEvent(DEBUG_WAIT_DEFAULT,INFINITE)!= S_OK)
break;
}
HRESULT ret=m_dbgControl->Execute(
DEBUG_OUTCTL_IGNORE,
".closehandle -a", // Close all handles allocated
DEBUG_EXECUTE_NOT_LOGGED );
}
问题是:我无法执行命令“.closehandle-a”。每当我运行代码时,我总是得到“ret 0x80040205引发意外异常”。您能告诉我这有什么问题吗?您的进程是开始运行还是处于初始断点?在执行此命令之前,您可能首先需要进入该过程。我确实在托管代码中编写了类似的代码,通过命名管道启动Windbg服务器的进程,并且每当我要执行命令时,我都会启动cdbg.exe,它会连接到服务器并执行脚本。然后我可以从cdb收集输出并解析它。又好又容易。如果cdb.exe的输出被重定向到一个文件,我甚至可以用这种方法调试自己。在调试器命令完成后,我可以解析这个文件,让我再次执行。@AloisKraus抱歉,我不明白。循环完成时执行该命令。.closehandle-a将关闭目标进程中的所有句柄,包括共享内存和与目标进程通信所需的调试器线程句柄。我不确定这个命令有什么用,因为你几乎杀死了这个进程。如果你有正确的句柄关闭方法,那么你仍然有一个竞争条件。你似乎不知道是否有人已经关上了把手。句柄不是随机数,一旦关闭,它们将被重用。当您在最后关闭您创建的每个句柄(可能已经关闭了其中的一些句柄)时,您可以关闭一个未创建的句柄,并给应用程序带来一些随机错误。