2012-03-22 5 views
0

私はプロセスに接続してクラッシュダンプファイルを作成するために書いたデバッグプログラムを持っています。その部分は正常に動作します。DebugActiveProcessStopがデバッグアプリケーションをクラッシュさせるのはなぜですか?

問題は、デバッガプログラムが終了すると、デバッグしていたプログラムも終了するということです。

私はいくつかのGoogle検索を行い、DebugActiveProcessStop()API呼び出しを検出しました。これはWindows XPでのみ導入されたので、古いMSDNのドキュメントには表示されませんでしたので、実行時にKernel32.dllからdynamicallをロードしようとしました。

私の問題は、デバッガプログラムが_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キーワードを忘れてしまったため、クラッシュする理由があります。

これは動作します:

のtypedef BOOL(WINAPI * DEBUGSETPROCESSKILLONEXIT)(BOOL)を、

関連する問題