Я использую следующий код для создания файла мини-дампов всякий раз, когда из моего кода генерируется структурированное исключение:
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
, чтобы получить запись об исключении. Однако никакой информации не поступает (то есть я не получаю стек вызовов). Также, если я использую команду !analyze -v
, она может показать строку, где произошел сбой. Кто-нибудь знает, что мне не хватает и как это решить?
Кстати, я использую компилятор VC7 с флагом / EHa (модель исключений асинхронности).