2013-09-30 76 views
1

這裏有一段代碼是做主要工作的 - 附加到一個活躍的過程。儘管看起來子進程沒有在交換機中被捕獲爲CREATE_PROCESS_DEBUG_EVENT。 只有CREATE(EXIT)_THREAD_DEBUG_EVENT和LOAD_DLL_DEBUG_EVENT打印在stderr中,儘管我確切地知道創建了子進程(不是線程)。請指教。DebugActiveProcess是否也跟蹤子進程?

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); 
} 
+0

您是不是要說「子流程*是*創建的」? – arx

+0

謝謝,這裏的錯字 – Nelly

回答

2

文檔在msdn.microsoft.com說:「......就好像它創建與DEBUG_ONLY_THIS_PROCESS標誌的過程......」。

這意味着:使用DebugActiveProcess調試進程時,所有進程線程都被調試(當然),但子進程是而不是調試。爲了調試子進程,你可以爲CreateProcess()的第一個地址設置一個斷點(更確切地說:CreateProcessA,CreateProcessW,CreateProcessAsUserA,...)。當輸入此斷點時,修改flags字段,以便在掛起狀態下啓動進程,並在函數返回時調用DebugActiveProcess。

+0

感謝您的澄清,但你能告訴我如何以編程方式設置該功能(CreateProcessA/W)的斷點嗎? – Nelly

+0

獎金問題:如果子進程沒有調試,爲什麼我沒有看到至少CREATE_PROCESS_DEBUG_EVENT事件發生在頂級調試進程的主循環中? – Nelly