void Catch_SEH_Exception(DWORD nSeCode, PEXCEPTION_POINTERS pException) { g_theKernel.SetExceptionMode(true); //保存最后的错误代码 DWORD dwLastError = ::GetLastError(); if(!pException) return; //生成基本描述文件 TCHAR szSmallInfoFile[MAX_PATH] = {0}; if(!CreateSmallDumpInfo(pException, szSmallInfoFile, dwLastError)) { return; } //生成完整表述文件 TCHAR szBigInfoFile[MAX_PATH] = {0}; if(!CreateBigInfoFile(pException, szBigInfoFile, dwLastError)) { return; } TCHAR szDumpFile[MAX_PATH] = {0}; CreateDumpFile(pException, szDumpFile); //寻找CrashReport TCHAR szCrashReportFile[MAX_PATH] = {0}; ::GetModuleFileName(NULL, szCrashReportFile, MAX_PATH); ::PathRemoveFileSpec(szCrashReportFile); ::PathAppend(szCrashReportFile, _T("CrashReport.exe")); TCHAR szCmdLine[1024] = {0}; _sntprintf(szCmdLine, 1024, _T("%s \"%s\" \"%s\" \"%s\""), szCrashReportFile, szSmallInfoFile, szBigInfoFile, szDumpFile); //启动CrashReport STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(STARTUPINFO)); ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; if (::CreateProcess( NULL, szCmdLine, NULL, NULL, FALSE,CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi) == FALSE) { return; } }
//-------------------------------------------------- // 分析SEH数据 VOID KYLIN_API tProcessException(PEXCEPTION_POINTERS pException, bool bRunCrashReport) throw() { // 保存最后的错误代码 UINT dwLastError = ::GetLastError(); if(!pException) return; // 生成基本描述文件 TCHAR szSmallInfoFile[MAX_PATH] = {0}; if(!CreateSmallDumpInfo(pException, szSmallInfoFile, dwLastError)) { return; } // 生成完整表述文件 TCHAR szBigInfoFile[MAX_PATH] = {0}; if(!CreateBigInfoFile(pException, szBigInfoFile, dwLastError)) { return; } // 生成dump报告 TCHAR szDumpFile[MAX_PATH] = {0}; CreateDumpHelpFile(pException, szDumpFile); if(bRunCrashReport) { // 寻找ErrorReport TCHAR szCrashReportFile[MAX_PATH] = {0}; ::GetModuleFileName(NULL, szCrashReportFile, MAX_PATH); ::PathRemoveFileSpec(szCrashReportFile); ::PathAppend(szCrashReportFile, _T("ErrorReport.exe")); TCHAR szCmdLine[1024] = {0}; _sntprintf(szCmdLine, 1024, _T("%s \"%s\" \"%s\" \"%s\""), szCrashReportFile, szSmallInfoFile, szBigInfoFile, szDumpFile); // 启动ErrorReport STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(STARTUPINFO)); ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; ::CreateProcess( NULL, szCmdLine, NULL, NULL, FALSE,CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi); } }
VOID tProcessException(PEXCEPTION_POINTERS pException) throw() { //保存最后的错误代码 UINT dwLastError = ::GetLastError(); if(!pException) return; //生成完整表述文件 CHAR szBigInfoFile[MAX_PATH] = {0}; if(!CreateBigInfoFile(pException, szBigInfoFile, dwLastError)) { return; } //生成dump报告 CHAR szDumpFile[MAX_PATH] = {0}; //CreateDumpHelpFile(pException, szDumpFile); }