1

これは、アクティブなプロセスにアタッチするという主な処理を行うコードの一部です。子プロセスがスイッチで 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);
}
4

1 に答える 1

2

msdn.microsoft.com のドキュメントには、「... DEBUG_ONLY_THIS_PROCESS フラグを使用してプロセスを作成したかのように ...」と記載されています。

つまり: DebugActiveProcess でプロセスをデバッグする場合、プロセスのすべてのスレッドは (もちろん) デバッグされますが、子プロセスはデバッグされません

子プロセスもデバッグするには、ブレークポイントを CreateProcess() の最初のアドレスに設定します (より正確には、CreateProcessA、CreateProcessW、CreateProcessAsUserA、...)。このブレークポイントに入るとフラグ フィールドを変更して、プロセスが中断状態で開始され、関数が戻ったときに DebugActiveProcess を呼び出します。

于 2013-10-01T05:30:19.927 に答える