У меня есть программа отладки, которую я написал для присоединения к процессу и создания файла дампа сбоя. Эта часть отлично работает.Почему DebugActiveProcessStop разбивает мое приложение для отладки?
Проблема заключается в том, что когда программа отладчика завершается, программа также отлаживается.
Я сделал некоторый поиск в Google и нашел вызов API DebugActiveProcessStop(). Это не отображалось в моей старой документации MSDN, поскольку оно было введено только в Windows XP, поэтому я попытался загрузить его dynamicall из Kernel32.dll во время выполнения.
Теперь моя проблема в том, что моя программа отладки сработала, как только будет выполнен вызов _DebugActiveProcessStop(). Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?
typedef BOOL (*DEBUGACTIVEPROCESSSTOP)(DWORD);
DEBUGACTIVEPROCESSSTOP _DebugActiveProcessStop;
HMODULE hK32 = LoadLibrary("kernel32.dll");
if(hK32)
_DebugActiveProcessStop = (DEBUGACTIVEPROCESSSTOP) GetProcAddress(hK32,"DebugActiveProcessStop");
else
{
printf("Can't load Kernel32.dll\n");
return;
}
if(! _DebugActiveProcessStop)
{
printf("Can't find DebugActiveProcessStop\n");
return;
}
...
void DebugLoop(void)
{
DEBUG_EVENT de;
while(1)
{
WaitForDebugEvent(&de, INFINITE);
switch(de.dwDebugEventCode)
{
case CREATE_PROCESS_DEBUG_EVENT:
hProcess = de.u.CreateProcessInfo.hProcess;
break;
case EXCEPTION_DEBUG_EVENT:
// PDS: I want a crash dump immediately!
dwProcessId = de.dwProcessId;
dwThreadId = de.dwThreadId;
WriteCrashDump(&de.u.Exception);
return;
case CREATE_THREAD_DEBUG_EVENT:
case OUTPUT_DEBUG_STRING_EVENT:
case EXIT_THREAD_DEBUG_EVENT:
case EXIT_PROCESS_DEBUG_EVENT :
case LOAD_DLL_DEBUG_EVENT:
case UNLOAD_DLL_DEBUG_EVENT:
case RIP_EVENT:
default:
break;
}
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE);
}
}
...
void main(void)
{
...
BOOL bo = DebugActiveProcess(dwProcessId);
if(bo == 0)
printf("DebugActiveProcess failed, GetLastError: %u \n",GetLastError());
hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
if(hProcess == NULL)
printf("OpenProcess failed, GetLastError: %u \n",GetLastError());
DebugLoop();
_DebugActiveProcessStop(dwProcessId);
CloseHandle(hProcess);
}