VOID Get_Exception_Info(PEXCEPTION_POINTERS pException, FILE* fp, UINT dwLastError) { CHAR Module_Name[MAX_PATH]; PBYTE Module_Addr; HANDLE hFile; FILETIME Last_Write_Time; FILETIME Local_File_Time; SYSTEMTIME T; Get_Version_Str(fp); _ftprintf(fp, _T("------------------------------------------------------------------------------\n")); _ftprintf(fp, _T("Process: ") ); GetModuleFileName(NULL, Module_Name, MAX_PATH); _ftprintf(fp, _T("%s\n") , Module_Name); // If exception occurred. if (pException) { EXCEPTION_RECORD & E = *pException->ExceptionRecord; CONTEXT & C = *pException->ContextRecord; // If module with E.ExceptionAddress found - save its path and date. if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr)) { _ftprintf(fp, _T("Module: %s\n") , Module_Name); if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) { if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time)) { FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time); FileTimeToSystemTime(&Local_File_Time, &T); _ftprintf(fp, _T("Date Modified: %02d/%02d/%d\n") , T.wMonth, T.wDay, T.wYear); } CloseHandle(hFile); } } else { _ftprintf(fp, _T("Exception Addr: %08X\n") , (LONG_PTR)(E.ExceptionAddress)); } _ftprintf(fp, _T("------------------------------------------------------------------------------\n")); //加入具体异常解释信息 CreateExceptionDesc(pException, fp, dwLastError); } _ftprintf(fp, _T("------------------------------------------------------------------------------\n")); // Save call stack info. _ftprintf(fp, _T("Call Stack:\n")); Get_Call_Stack(pException, fp); }
bool CreateSmallDumpInfo(PEXCEPTION_POINTERS pException, PTCHAR szSmallFile, DWORD dwLastError) { if (!pException) return false; //创建基本描述文件 TCHAR szTempDir[MAX_PATH] = {0}; ::GetTempPath(MAX_PATH, szTempDir); TCHAR szTempFile[MAX_PATH] = {0}; ::GetTempFileName(szTempDir, _T("sml"), MAX_PATH, szTempFile); FILE* fp = _tfopen(szTempFile, _T("w")); if(!fp) return false; CreateExceptionDesc( pException, fp, dwLastError); fclose(fp); fp = NULL; ::GetShortPathName(szTempFile, szSmallFile, MAX_PATH); if(szSmallFile[0] == 0) return false; return true; }
//************************************************************* void Get_Exception_Info(PEXCEPTION_POINTERS pException, FILE* fp, DWORD dwLastError) //************************************************************* // Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str. { int i; TCHAR Module_Name[MAX_PATH]; PBYTE Module_Addr; HANDLE hFile; FILETIME Last_Write_Time; FILETIME Local_File_Time; SYSTEMTIME T; Get_Version_Str(fp); _ftprintf(fp, _T("------------------------------------------------------------------------------")NL); _ftprintf(fp, _T("Process: ") ); GetModuleFileName(NULL, Module_Name, MAX_PATH); _ftprintf(fp, _T("%s") NL, Module_Name); // If exception occurred. if (pException) { EXCEPTION_RECORD & E = *pException->ExceptionRecord; CONTEXT & C = *pException->ContextRecord; // If module with E.ExceptionAddress found - save its path and date. if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr)) { _ftprintf(fp, _T("Module: %s") NL, Module_Name); if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) { if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time)) { FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time); FileTimeToSystemTime(&Local_File_Time, &T); _ftprintf(fp, _T("Date Modified: %02d/%02d/%d") NL, T.wMonth, T.wDay, T.wYear); } CloseHandle(hFile); } } else { _ftprintf(fp, _T("Exception Addr: %08X") NL , (LONG_PTR)(E.ExceptionAddress)); } _ftprintf(fp, _T("------------------------------------------------------------------------------")NL); //加入具体异常解释信息 CreateExceptionDesc(pException, fp, dwLastError); _ftprintf(fp, _T("------------------------------------------------------------------------------")NL); // Save instruction that caused exception. if(E.ExceptionAddress) { _ftprintf(fp, _T("Instruction: ")NL); for (i = 0; i < 16; i++) _ftprintf(fp, _T(" %02X"), PBYTE(E.ExceptionAddress)[i]); } // Save registers at exception. _ftprintf(fp, NL _T("Registers:") NL); _ftprintf(fp, _T("EAX: %08X EBX: %08X ECX: %08X EDX: %08X") NL, C.Eax, C.Ebx, C.Ecx, C.Edx); _ftprintf(fp, _T("ESI: %08X EDI: %08X ESP: %08X EBP: %08X")NL, C.Esi, C.Edi, C.Esp, C.Ebp); _ftprintf(fp, _T("EIP: %08X EFlags: %08X")NL, C.Eip, C.EFlags); } //if (pException) _ftprintf(fp, _T("------------------------------------------------------------------------------")NL); // Save call stack info. _ftprintf(fp, _T("Call Stack:")NL); Get_Call_Stack(pException, fp); } //Get_Exception_Info