void CrashRptAPITests::Test_crAddScreenshot() { // Should fail, because crInstall() should be called first int nResult = crAddScreenshot(CR_AS_VIRTUAL_SCREEN); TEST_ASSERT(nResult!=0); // Install crash handler CR_INSTALL_INFOW infoW; memset(&infoW, 0, sizeof(CR_INSTALL_INFOW)); infoW.cb = sizeof(CR_INSTALL_INFOW); infoW.pszAppVersion = L"1.0.0"; // Specify app version, otherwise it will fail. int nInstallResult = crInstallW(&infoW); TEST_ASSERT(nInstallResult==0); // Should succeed int nResult2 = crAddScreenshot(CR_AS_VIRTUAL_SCREEN); TEST_ASSERT(nResult2==0); // Call twice - should succeed int nResult3 = crAddScreenshot(CR_AS_MAIN_WINDOW); TEST_ASSERT(nResult3==0); __TEST_CLEANUP__; // Uninstall crUninstall(); }
int CVS2010MFCDemoApp::Run() { // Call your crInstall code here ... CR_INSTALL_INFO info; // Install crash handlers int nInstResult = crInstall(&info); assert(nInstResult==0); nInstResult = crAddScreenshot(CR_AS_MAIN_WINDOW); assert(nInstResult==0); // Check result if(nInstResult!=0) { TCHAR buff[256]; crGetLastErrorMsg(buff, 256); // Get last error _tprintf(_T("%s\n"), buff); // and output it to the screen return FALSE; } BOOL bRun; BOOL bExit=FALSE; while(!bExit) { bRun= CWinApp::Run(); bExit=TRUE; } // Uninstall crash reporting //crUninstall(); return bRun; }
BOOL WINAPI CrashCallback(LPVOID lpvState) { CString sLogFile = GetAppDir() + _T("\\dummy.log"); CString sIniFile = GetAppDir() + _T("\\dummy.ini"); #ifdef TEST_DEPRECATED_FUNCS AddFile(lpvState, sLogFile, _T("Dummy Log File")); AddFile(lpvState, sLogFile, _T("Dummy INI File")); #else lpvState; int nResult = crAddFile2(sLogFile, NULL, _T("Dummy Log File"), CR_AF_MAKE_FILE_COPY); ATLASSERT(nResult==0); nResult = crAddFile(sIniFile, _T("Dummy INI File")); ATLASSERT(nResult==0); nResult = crAddScreenshot(CR_AS_MAIN_WINDOW); ATLASSERT(nResult==0); nResult = crAddProperty(_T("VideoCard"),_T("nVidia GeForce 9800")); ATLASSERT(nResult==0); #endif return TRUE; }
////////////////////////////////////////////////////////////////////////// // crash rpt // Define the callback function that will be called on crash BOOL WINAPI CrashCallback(LPVOID /*lpvState*/) { // Add two files to the error report: // log file and application configuration file crAddFile2(_T("log.txt"), NULL, _T("Log File"), CR_AF_MAKE_FILE_COPY); crAddFile2(_T("config.ini"), NULL, _T("Configuration File"), CR_AF_MAKE_FILE_COPY); // We want the screenshot of the entire desktop is to be // added on crash crAddScreenshot(CR_AS_VIRTUAL_SCREEN); // Add a named property that means what graphics adapter is // installed on user's machine crAddProperty(_T("VideoCard"), _T("nVidia GeForce 8600 GTS")); return TRUE; }
// A helper function that creates a error report for testing BOOL TestUtils::CreateErrorReport(CString sTmpFolder, CString& sErrorReportName, CString& sMD5Hash) { BOOL bStatus = FALSE; CString sReportFolder; DWORD dwExitCode = 1; WIN32_FIND_DATA ffd; HANDLE hFind = INVALID_HANDLE_VALUE; CString sSearchPattern = sTmpFolder + "\\*.zip"; CString sMD5FileName; FILE* f = NULL; TCHAR szHashBuff[256] = _T(""); HKEY hKey = NULL; LONG lResult = -1; CString sKeyName = _T("Software\\CrashRpt&ၸwer\\应用程序名称"); CString sKeyName2 = _T("HKEY_CURRENT_USER\\") + sKeyName; lResult = RegCreateKey(HKEY_CURRENT_USER, sKeyName, &hKey); if(lResult!=ERROR_SUCCESS) goto cleanup; DWORD dwVal = 12345; lResult = RegSetValueEx(hKey, _T("Value$%^!@#&123fer"), 0, REG_DWORD, (LPBYTE)&dwVal, sizeof(DWORD)); if(lResult!=ERROR_SUCCESS) goto cleanup; CR_INSTALL_INFOW infoW; memset(&infoW, 0, sizeof(CR_INSTALL_INFOW)); infoW.cb = sizeof(CR_INSTALL_INFOW); infoW.pszAppName = L"My& app Name &"; // Use appname with restricted XML characters infoW.pszAppVersion = L"1.0.0 &<'a应> \"<"; infoW.pszErrorReportSaveDir = sTmpFolder; infoW.dwFlags = CR_INST_NO_GUI|CR_INST_DONT_SEND_REPORT|CR_INST_STORE_ZIP_ARCHIVES; int nInstallResult = crInstallW(&infoW); if(nInstallResult!=0) goto cleanup; crAddScreenshot(CR_AS_MAIN_WINDOW); crAddPropertyW(L"CustomProp", L"Property Value"); crAddRegKey(sKeyName2, L"regkey.xml", 0); CR_EXCEPTION_INFO ei; memset(&ei, 0, sizeof(CR_EXCEPTION_INFO)); ei.cb = sizeof(ei); ei.exctype = CR_SEH_EXCEPTION; ei.code = 0x123; // Generate error report int nGenResult = crGenerateErrorReport(&ei); if(nGenResult!=0) goto cleanup; // Wait until CrashSender process exits WaitForSingleObject(ei.hSenderProcess, INFINITE); // Check exit code GetExitCodeProcess(ei.hSenderProcess, &dwExitCode); if(dwExitCode!=0) goto cleanup; // Get ZIP name hFind = FindFirstFile(sSearchPattern, &ffd); if(hFind==INVALID_HANDLE_VALUE) goto cleanup; sErrorReportName = sTmpFolder + _T("\\") + CString(ffd.cFileName); FindClose(hFind); hFind = NULL; // Get MD5 name sSearchPattern = sTmpFolder + "\\*.md5"; hFind = FindFirstFile(sSearchPattern, &ffd); if(hFind==INVALID_HANDLE_VALUE) goto cleanup; sMD5FileName = sTmpFolder + _T("\\") + CString(ffd.cFileName); #if _MSC_VER < 1400 f = _tfopen(sMD5FileName, _T("rt")); #else _tfopen_s(&f, sMD5FileName, _T("rt")); #endif if(f==NULL) goto cleanup; TCHAR* szHash = _fgetts(szHashBuff, 256, f); if(szHash==NULL) goto cleanup; sMD5Hash = szHash; if(sMD5Hash.GetLength()!=32) goto cleanup; // Hash must be 32 characters in length bStatus = TRUE; cleanup: crUninstall(); if(f!=NULL) fclose(f); if(hFind!=INVALID_HANDLE_VALUE) FindClose(hFind); if(hKey) RegCloseKey(hKey); RegDeleteKey(HKEY_CURRENT_USER, sKeyName); return bStatus; }