DebugActiveProcess是否也跟踪子进程?

时间:2013-09-30 11:20:31

标签: c++ debugging winapi process systems-programming

这是执行主要任务的代码片段 - 附加到活动进程。虽然看起来子进程没有在交换机中被捕获为CREATE_PROCESS_DEBUG_EVENT。 只有CREATE(EXIT)_THREAD_DEBUG_EVENT和LOAD_DLL_DEBUG_EVENT在stderr中打印,但我确切地知道创建了子进程(而不是线程)。请指教。

    DebugActiveProcess(processId);
    DebugSetProcessKillOnExit(false);

    while (!done) {
        DWORD status = DBG_CONTINUE;
        DEBUG_EVENT debugEvent;

        WaitForDebugEvent(&debugEvent, INFINITE);
        switch (debugEvent.dwDebugEventCode) {

        cerr << "Got event " << debugEvent.dwDebugEventCode << endl;

        case CREATE_PROCESS_DEBUG_EVENT:
        {
            CREATE_PROCESS_DEBUG_INFO &info = debugEvent.u.CreateProcessInfo;
            cerr << "process created " << debugEvent.dwProcessId << endl;  
            break;
        }
        case EXIT_PROCESS_DEBUG_EVENT:
        {
            EXIT_PROCESS_DEBUG_INFO &info = debugEvent.u.ExitProcess;
            cerr << "process exited" << endl;
            break;
        }       
        case LOAD_DLL_DEBUG_EVENT:
        {
            CloseHandle(debugEvent.u.LoadDll.hFile);
            break;
        }
        }
        ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, status);
}

1 个答案:

答案 0 :(得分:2)

msdn.microsoft.com上的文档说:“......好像它使用DEBUG_ONLY_THIS_PROCESS标志创建了进程......”。

这意味着:使用DebugActiveProcess调试进程时,会调试进程的所有线程(当然)但子进程是通过而不是调试的。

要调试子进程,您可以将断点设置为CreateProcess()的第一个地址(更准确地说:CreateProcessA,CreateProcessW,CreateProcessAsUserA,...)。输入此断点时,您可以修改flags字段,以便进程以挂起状态启动,当函数返回时,调用DebugActiveProcess。