2012-03-22 2 views
0

У меня есть программа отладки, которую я написал для присоединения к процессу и создания файла дампа сбоя. Эта часть отлично работает.Почему 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); 
} 

ответ

0

Причина, по которой это происходит из-за того, что я пропустил ключевое слово WINAPI в определениях указателей на функцию.

Это работает:

ЬурейеЕ BOOL (WINAPI * DEBUGSETPROCESSKILLONEXIT) (BOOL);

Смежные вопросы