Я использую следующий код для создания файла minidump всякий раз, когда есть структурированное исключение, сгенерированное из моего кода:
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 (asynchronuos exception model).