1

这是一段代码做主要的事情 - 附加到一个活动的进程。虽然看起来子进程在开关中没有被捕获为 CREATE_PROCESS_DEBUG_EVENT 。只有 CREATE(EXIT)_THREAD_DEBUG_EVENT 和 LOAD_DLL_DEBUG_EVENT 打印在标准错误中,尽管我确切地知道创建了子进程(不是线程)。请指教。

    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);
}
4

1 回答 1

2

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

这意味着:当使用 DebugActiveProcess 调试进程时,进程的所有线程都被调试(当然),但子进程没有被调试。

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

于 2013-10-01T05:30:19.927 回答