Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Windbg收集句柄_Windbg_Handle - Fatal编程技术网

使用Windbg收集句柄

使用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")

我正在使用Windbg sdk编写自己的调试器。调试器能够收集已调试应用程序分配的所有句柄,以避免句柄泄漏。这是我的密码:

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将关闭目标进程中的所有句柄,包括共享内存和与目标进程通信所需的调试器线程句柄。我不确定这个命令有什么用,因为你几乎杀死了这个进程。如果你有正确的句柄关闭方法,那么你仍然有一个竞争条件。你似乎不知道是否有人已经关上了把手。句柄不是随机数,一旦关闭,它们将被重用。当您在最后关闭您创建的每个句柄(可能已经关闭了其中的一些句柄)时,您可以关闭一个未创建的句柄,并给应用程序带来一些随机错误。