Создание минидампа для исключения нарушения прав доступа с помощью SetUnhandledExceptionFilter ()

Я использую следующий код для создания файла минидампа всякий раз, когда из моего кода генерируется структурированное исключение:

void CreateMiniDump( EXCEPTION_POINTERS* pep ) 
{
  // Open the file 
typedef BOOL (*PDUMPFN)( 
  HANDLE hProcess, 
  DWORD ProcessId, 
  HANDLE hFile, 
  MINIDUMP_TYPE DumpType, 
  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, 
  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, 
  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);


    HANDLE hFile = CreateFile( _T("C:/temp/MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE, 
    0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

    HMODULE h = ::LoadLibrary(L"DbgHelp.dll");
    PDUMPFN pFn = (PDUMPFN)GetProcAddress(h, "MiniDumpWriteDump");

  if( ( hFile != NULL ) && ( hFile != INVALID_HANDLE_VALUE ) ) 
  {
    // Create the minidump 

    MINIDUMP_EXCEPTION_INFORMATION mdei; 

    mdei.ThreadId           = GetCurrentThreadId(); 
    mdei.ExceptionPointers  = pep; 
    mdei.ClientPointers     = TRUE; 

    MINIDUMP_TYPE mdt       = MiniDumpNormal; 

    BOOL rv = (*pFn)( GetCurrentProcess(), GetCurrentProcessId(), 
      hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0 ); 



    // Close the file 

    CloseHandle( hFile ); 

  }

}

LONG WINAPI MyUnhandledExceptionFilter(
 struct _EXCEPTION_POINTERS *ExceptionInfo
)
 {
     CreateMiniDump(ExceptionInfo);
     return EXCEPTION_EXECUTE_HANDLER;
 }

И я делаю SetUnhandledExceptionFilter (MyUnhandledExceptionFilter); из основной точки входа моего приложения (хотя я не устанавливаю его для каждого потока). После этого, чтобы проверить этот код, я сделал следующее, чтобы сгенерировать нарушение прав доступа: int * p = 0; * p = 0; Файл дампа был создан. Затем я использовал windbg, открыл файл дампа и использовал команду .ecxr для получения записи об исключении. Однако никакой информации туда не поступает (т.е. я не получаю стек вызовов). Также, если я использую команду ! Analysis -v , тогда она сможет показать строку, в которой произошел сбой. Кто-нибудь знает, что мне не хватает и как это решить?

Кстати, я использую компилятор VC7 с флагом / EHa (асинхронная модель исключений).

11
задан Naveen 31 January 2011 в 10:48
поделиться