Почему DebugActiveProcessStop аварийно завершает работу моего приложения отладки? - PullRequest
0 голосов
/ 23 марта 2012

У меня есть отладочная программа, которую я написал, чтобы прикрепить к процессу и создать файл аварийного дампа.Эта часть работает нормально.

Проблема, с которой я сталкиваюсь, заключается в том, что когда программа отладчика завершает работу, то же самое делает и программа, которую она отлаживала.,Это не отображалось в моей старой документации MSDN, поскольку оно было представлено только в Windows XP, поэтому я попытался загрузить его dynamicicall из 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 );
}

1 Ответ

0 голосов
/ 23 марта 2012

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

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

typedef BOOL (WINAPI * DEBUGSETPROCESSKILLONEXIT) (BOOL);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...