void CrashRptAPITests::Test_crAddScreenshot2() { // Should fail, because crInstall() should be called first int nResult = crAddScreenshot2(CR_AS_VIRTUAL_SCREEN, 95); 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 = crAddScreenshot2(CR_AS_VIRTUAL_SCREEN, 50); TEST_ASSERT(nResult2==0); // Call twice - should succeed int nResult3 = crAddScreenshot2(CR_AS_MAIN_WINDOW, 60); TEST_ASSERT(nResult3==0); // Call with invalid JPEG quality - should fail int nResult4 = crAddScreenshot2(CR_AS_MAIN_WINDOW, -60); TEST_ASSERT(nResult4!=0); // Call with invalid JPEG quality - should fail int nResult5 = crAddScreenshot2(CR_AS_MAIN_WINDOW, 160); TEST_ASSERT(nResult5!=0); __TEST_CLEANUP__; // Uninstall crUninstall(); }
int CMFCDemoApp::Run() { // Install crash reporting CR_INSTALL_INFO info; memset(&info, 0, sizeof(CR_INSTALL_INFO)); info.cb = sizeof(CR_INSTALL_INFO); info.pszAppName = _T("MFCDemo"); // Define application name. //info.pszAppVersion = _T("1.0.0"); // Define application version. // URL for sending error reports over HTTP. info.pszUrl = _T("http://someserver.com/crashrpt.php"); // Install all available exception handlers. info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; // Provide privacy policy URL info.pszPrivacyPolicyURL = _T("http://someserver.com/privacy.html"); int nResult = crInstall(&info); if(nResult!=0) { TCHAR buff[256]; crGetLastErrorMsg(buff, 256); MessageBox(NULL, buff, _T("crInstall error"), MB_OK); return 1; } // Take screenshot of the app window at the moment of crash crAddScreenshot2(CR_AS_MAIN_WINDOW|CR_AS_USE_JPEG_FORMAT, 95); BOOL bRun = TRUE; BOOL bExit=FALSE; while(!bExit) { bRun= CWinApp::Run(); bExit=TRUE; } // Uninstall crash reporting crUninstall(); return bRun; }
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) { HRESULT hRes = ::CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call instead to // make the EXE free threaded. This means that calls come in on a random RPC thread. // HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); ATLASSERT(SUCCEEDED(hRes)); // Install crash reporting CR_INSTALL_INFO info; memset(&info, 0, sizeof(CR_INSTALL_INFO)); info.cb = sizeof(CR_INSTALL_INFO); info.pszAppName = _T("WTLDemo"); // Define application name. //info.pszAppVersion = _T("1.3.1"); // Define application version. info.pszEmailSubject = _T("WTLDemo Error Report"); // Define subject for email. info.pszEmailTo = _T("*****@*****.**"); // Define E-mail recipient address. //info.pszSmtpProxy = _T("127.0.0.1"); // Use SMTP proxy. //info.pszSmtpLogin = _T("test"); // SMTP Login //info.pszSmtpPassword = _T("test"); // SMTP Password info.pszUrl = _T("http://localhost:80/crashrpt.php"); // URL for sending reports over HTTP. info.pfnCrashCallback = CrashCallback; // Define crash callback function. // Define delivery methods priorities. info.uPriorities[CR_HTTP] = 3; // Use HTTP the first. info.uPriorities[CR_SMTP] = 2; // Use SMTP the second. info.uPriorities[CR_SMAPI] = 1; // Use Simple MAPI the last. info.dwFlags = 0; info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; // Install all available exception handlers. //info.dwFlags |= CR_INST_APP_RESTART; // Restart the application on crash. //info.dwFlags |= CR_INST_NO_MINIDUMP; // Do not include minidump. //info.dwFlags |= CR_INST_NO_GUI; // Don't display GUI. //info.dwFlags |= CR_INST_DONT_SEND_REPORT; // Don't send report immediately, just queue for later delivery. //info.dwFlags |= CR_INST_STORE_ZIP_ARCHIVES; // Store ZIP archives along with uncompressed files (to be used with CR_INST_DONT_SEND_REPORT) //info.dwFlags |= CR_INST_SEND_MANDATORY; // Remove "Close" and "Other actions..." buttons from Error Report dialog. //info.dwFlags |= CR_INST_SHOW_ADDITIONAL_INFO_FIELDS; //!< Make "Your E-mail" and "Describe what you were doing when the problem occurred" fields of Error Report dialog always visible. info.dwFlags |= CR_INST_ALLOW_ATTACH_MORE_FILES; //!< Adds an ability for user to attach more files to crash report by clicking "Attach More File(s)" item from context menu of Error Report Details dialog. //info.dwFlags |= CR_INST_SEND_QUEUED_REPORTS; // Send reports that were failed to send recently. //info.dwFlags |= CR_INST_AUTO_THREAD_HANDLERS; info.pszDebugHelpDLL = NULL; // Search for dbghelp.dll using default search sequence. info.uMiniDumpType = MiniDumpNormal; // Define minidump size. // Define privacy policy URL. info.pszPrivacyPolicyURL = _T("http://code.google.com/p/crashrpt/wiki/PrivacyPolicyTemplate"); info.pszErrorReportSaveDir = NULL; // Save error reports to the default location. info.pszRestartCmdLine = _T("/restart"); // Command line for automatic app restart. //info.pszLangFilePath = _T("D:\\"); // Specify custom dir or filename for language file. //info.pszCustomSenderIcon = _T("C:\\WINDOWS\\System32\\user32.dll, 1"); // Specify custom icon for CrashRpt dialogs. info.nRestartTimeout = 50; // Install crash handlers. CrAutoInstallHelper cr_install_helper(&info); if(cr_install_helper.m_nInstallStatus!=0) { TCHAR buff[256]; crGetLastErrorMsg(buff, 256); MessageBox(NULL, buff, _T("crInstall error"), MB_OK); return FALSE; } ATLASSERT(cr_install_helper.m_nInstallStatus==0); CString sLogFile = GetAppDir() + _T("\\*.log"); CString sIniFile = _T("\\\\?\\") + GetAppDir() + _T("\\dummy.ini"); int nResult = crAddFile2(sLogFile, NULL, _T("Dummy Log File"), CR_AF_MAKE_FILE_COPY|CR_AF_ALLOW_DELETE); ATLASSERT(nResult==0); nResult = crAddFile2(sIniFile, NULL, _T("Dummy INI File"), 0); ATLASSERT(nResult==0); nResult = crAddScreenshot2(CR_AS_PROCESS_WINDOWS|CR_AS_USE_JPEG_FORMAT|CR_AS_ALLOW_DELETE, 10); //nResult = crAddScreenshot(CR_AS_MAIN_WINDOW); ATLASSERT(nResult==0); nResult = crAddProperty(_T("AnExampleProperty"),_T("Property value")); ATLASSERT(nResult==0); nResult = crAddProperty(_T("VideoCard"),_T("nVidia GeForce 9800")); ATLASSERT(nResult==0); nResult = crAddProperty(_T("HDDSerialNumber"),_T("1234512345098765")); ATLASSERT(nResult==0); nResult = crAddProperty(_T("MACAddress"),_T("11.11.11.11")); ATLASSERT(nResult==0); nResult = crAddProperty(_T("UserName"),_T("TheUserName")); ATLASSERT(nResult==0); nResult = crAddRegKey(_T("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), _T("regkey.xml"), CR_AR_ALLOW_DELETE); ATLASSERT(nResult==0); nResult = crAddRegKey(_T("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), _T("regkey.xml"), CR_AR_ALLOW_DELETE); ATLASSERT(nResult==0); /* Create another thread */ g_CrashThreadInfo.m_bStop = false; g_CrashThreadInfo.m_hWakeUpEvent = CreateEvent(NULL, FALSE, FALSE, _T("WakeUpEvent")); ATLASSERT(g_CrashThreadInfo.m_hWakeUpEvent!=NULL); DWORD dwThreadId = 0; g_hWorkingThread = CreateThread(NULL, 0, CrashThread, (LPVOID)&g_CrashThreadInfo, 0, &dwThreadId); ATLASSERT(g_hWorkingThread!=NULL); // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used ::DefWindowProc(NULL, 0, 0, 0L); AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls hRes = _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); int nRet = Run(lpstrCmdLine, nCmdShow); _Module.Term(); // Close another thread g_CrashThreadInfo.m_bStop = true; SetEvent(g_CrashThreadInfo.m_hWakeUpEvent); // Wait until thread terminates WaitForSingleObject(g_hWorkingThread, INFINITE); ::CoUninitialize(); return nRet; }
crAddScreenshot( DWORD dwFlags ) { return crAddScreenshot2(dwFlags, 95); }
int _tmain(int argc, _TCHAR* argv[]) { CR_INSTALL_INFO info; memset(&info, 0, sizeof(CR_INSTALL_INFO)); info.cb = sizeof(CR_INSTALL_INFO); info.pszAppName = _T("WTLDemo"); // Define application name. info.pszAppVersion = _T("1.3.1"); // Define application version. info.pszEmailSubject = _T("WTLDemo Error Report"); // Define subject for email. info.pszEmailTo = _T("*****@*****.**"); // Define E-mail recipient address. //info.pszSmtpProxy = _T("127.0.0.1"); // Use SMTP proxy. //info.pszSmtpLogin = _T("test"); // SMTP Login //info.pszSmtpPassword = _T("test"); // SMTP Password info.pszUrl = _T("http://192.168.0.26:9000/Operation/CrashLog"); // URL for sending reports over HTTP. //info.pfnCrashCallback = CrashCallback; // Define crash callback function. // Define delivery methods priorities. info.uPriorities[CR_HTTP] = 3; // Use HTTP the first. info.uPriorities[CR_SMTP] = 2; // Use SMTP the second. info.uPriorities[CR_SMAPI] = 1; // Use Simple MAPI the last. info.dwFlags = 0; info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; // Install all available exception handlers. //info.dwFlags |= CR_INST_APP_RESTART; // Restart the application on crash. //info.dwFlags |= CR_INST_NO_MINIDUMP; // Do not include minidump. //info.dwFlags |= CR_INST_NO_GUI; // Don't display GUI. //info.dwFlags |= CR_INST_DONT_SEND_REPORT; // Don't send report immediately, just queue for later delivery. //info.dwFlags |= CR_INST_STORE_ZIP_ARCHIVES; // Store ZIP archives along with uncompressed files (to be used with CR_INST_DONT_SEND_REPORT) //info.dwFlags |= CR_INST_SEND_MANDATORY; // Remove "Close" and "Other actions..." buttons from Error Report dialog. //info.dwFlags |= CR_INST_SHOW_ADDITIONAL_INFO_FIELDS; //!< Make "Your E-mail" and "Describe what you were doing when the problem occurred" fields of Error Report dialog always visible. info.dwFlags |= CR_INST_ALLOW_ATTACH_MORE_FILES; //!< Adds an ability for user to attach more files to crash report by clicking "Attach More File(s)" item from context menu of Error Report Details dialog. //info.dwFlags |= CR_INST_SEND_QUEUED_REPORTS; // Send reports that were failed to send recently. //info.dwFlags |= CR_INST_AUTO_THREAD_HANDLERS; info.pszDebugHelpDLL = NULL; // Search for dbghelp.dll using default search sequence. info.uMiniDumpType = MiniDumpNormal; // Define minidump size. // Define privacy policy URL. //info.pszPrivacyPolicyURL = _T("http://code.google.com/p/crashrpt/wiki/PrivacyPolicyTemplate"); info.pszErrorReportSaveDir = NULL; // Save error reports to the default location. info.pszRestartCmdLine = _T("/restart"); // Command line for automatic app restart. //info.pszLangFilePath = _T("D:\\"); // Specify custom dir or filename for language file. //info.pszCustomSenderIcon = _T("C:\\WINDOWS\\System32\\user32.dll, 1"); // Specify custom icon for CrashRpt dialogs. // Install crash handlers. CrAutoInstallHelper cr_install_helper(&info); if(cr_install_helper.m_nInstallStatus!=0) { TCHAR buff[256]; crGetLastErrorMsg(buff, 256); MessageBox(NULL, buff, _T("crInstall error"), MB_OK); return FALSE; } assert(cr_install_helper.m_nInstallStatus==0); std::wstring sLogFile =L".\\*.log"; std::wstring sIniFile = L".\\dummy.ini"; int nResult = crAddFile2(sLogFile.c_str(), NULL, _T("Dummy Log File"), CR_AF_MAKE_FILE_COPY|CR_AF_ALLOW_DELETE); assert(nResult==0); nResult = crAddFile2(sIniFile.c_str(), NULL, _T("Dummy INI File"), 0); assert(nResult==0); nResult = crAddScreenshot2(CR_AS_PROCESS_WINDOWS|CR_AS_USE_JPEG_FORMAT|CR_AS_ALLOW_DELETE, 10); //nResult = crAddScreenshot(CR_AS_MAIN_WINDOW); assert(nResult==0); nResult = crAddProperty(_T("AnExampleProperty"),_T("Property value")); assert(nResult==0); nResult = crAddProperty(_T("VideoCard"),_T("nVidia GeForce 9800")); assert(nResult==0); nResult = crAddProperty(_T("HDDSerialNumber"),_T("1234512345098765")); assert(nResult==0); nResult = crAddProperty(_T("MACAddress"),_T("11.11.11.11")); assert(nResult==0); nResult = crAddProperty(_T("UserName"),_T("TheUserName")); assert(nResult==0); nResult = crAddRegKey(_T("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), _T("regkey.xml"), CR_AR_ALLOW_DELETE); assert(nResult==0); nResult = crAddRegKey(_T("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), _T("regkey.xml"), CR_AR_ALLOW_DELETE); assert(nResult==0); printf("Press Enter to simulate a null pointer exception or any other key to exit...\n"); int n = _getch(); if(n==13) { int *p = 0; *p = 0; // Access violation } int nUninstRes = crUninstall(); // Uninstall exception handlers assert(nUninstRes==0); return 0; }
BOOL CAlarmCenterApp::InitInstance() { /*{ bool connect_by_sse_or_ip_ = true; std::string cloud_sse_id_ = ""; std::string device_ipv4_ = ""; int device_port_ = 0; std::wstring user_name_ = L""; int user_id = 0; std::wstring _device_note = L""; int _id = 0; CString sql; sql.Format(L"update table_device_info_jovision set \ connect_by_sse_or_ip=%d,\ cloud_sse_id='%s',\ device_ipv4='%s',\ device_port=%d,\ user_name='%s',\ user_passwd='%s',\ user_info_id=%d,\ device_note='%s' where id=%d", connect_by_sse_or_ip_ ? 1 : 0, utf8::a2w(cloud_sse_id_).c_str(), utf8::a2w(device_ipv4_).c_str(), device_port_, user_name_.c_str(), user_id, _device_note.c_str(), _id); JLOG(sql); }*/ do { if (IfProcessRunning()) break; auto log = log::get_instance(); log->set_output_to_dbg_view(); log->set_line_prifix("HB"); log->set_log_file_foler(get_exe_path_a() + "\\Log"); log->set_log_file_prefix("AlarmCenter"); log->set_output_to_file(); JLOG(L"AlarmCenter startup.\n"); AUTO_LOG_FUNCTION; int nRet; WSAData wsData; nRet = WSAStartup(MAKEWORD(2, 2), &wsData); if (nRet < 0) { JLOG(L"Can't load winsock.dll.\n"); break; } #pragma region init crashrpt // Place all significant initialization in InitInstance // Define CrashRpt configuration parameters CR_INSTALL_INFO info; memset(&info, 0, sizeof(CR_INSTALL_INFO)); info.cb = sizeof(CR_INSTALL_INFO); info.pszAppName = _T("AlarmCenter"); static CString version; detail::GetProductVersion(version); info.pszAppVersion = version; info.pszEmailSubject = _T("AlarmCenter Error Report"); info.pszEmailTo = _T("*****@*****.**"); info.pszUrl = _T("http://113.140.30.118/crashrpt.php"); info.uPriorities[CR_HTTP] = 3; // First try send report over HTTP info.uPriorities[CR_SMTP] = 2; // Second try send report over SMTP info.uPriorities[CR_SMAPI] = 1; // Third try send report over Simple MAPI // Install all available exception handlers info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; // Restart the app on crash info.dwFlags |= CR_INST_APP_RESTART; info.dwFlags |= CR_INST_SEND_QUEUED_REPORTS; //info.pszRestartCmdLine = _T("/restart"); // Define the Privacy Policy URL //info.pszPrivacyPolicyURL = _T("http://myapp.com/privacypolicy.html"); // Install crash reporting int nResult = crInstall(&info); if (nResult != 0) { // Something goes wrong. Get error message. TCHAR szErrorMsg[512] = _T(""); crGetLastErrorMsg(szErrorMsg, 512); _tprintf_s(_T("%s\n"), szErrorMsg); MessageBox(nullptr, szErrorMsg, L"Error", MB_ICONERROR); break; } // Set crash callback function //crSetCrashCallback(CrashCallback, nullptr); // Add our log file to the error report crAddFile2(utf8::a2w(log::get_instance()->get_log_file_path()).c_str(), nullptr, _T("Log File"), CR_AF_MAKE_FILE_COPY); // We want the screenshot of the entire desktop is to be added on crash crAddScreenshot2(CR_AS_VIRTUAL_SCREEN, 0); // Add a named property that means what graphics adapter is // installed on user's machine //crAddProperty(_T("VideoCard"), _T("nVidia GeForce 8600 GTS")); #pragma endregion auto res = res::get_instance(); auto cfg = util::CConfigHelper::get_instance(); auto lang = cfg->get_language(); auto path = get_exe_path(); #ifdef _DEBUG path = path.substr(0, path.find_last_of(L'\\')); path += L"\\installer"; #endif switch (lang) { case util::AL_TAIWANESE: res->parse_file(path + L"\\lang\\zh-tw.txt"); SetThreadUILanguage(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_DEFAULT)); break; case util::AL_ENGLISH: res->parse_file(path + L"\\lang\\en-us.txt"); SetThreadUILanguage(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); break; case util::AL_CHINESE: default: res->parse_file(path + L"\\lang\\zh-cn.txt"); SetThreadUILanguage(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT)); break; } CAppResource::get_instance(); // InitCommonControlsEx() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // Set this to include all the common control classes you want to use // in your application. InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // Create the shell manager, in case the dialog contains // any shell tree view or shell list view controls. auto pShellManager = std::make_unique<CShellManager>(); // Activate "Windows Native" visual manager for enabling themes in MFC controls //CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need // Change the registry key under which our settings are stored // You should modify this string to be something appropriate // such as the name of your company or organization SetRegistryKey(_T("Local AppWizard-Generated Applications")); CLoginDlg loginDlg; if (loginDlg.DoModal() != IDOK) { JLOG(L"user canceled login.\n"); break; } CSetupNetworkDlg setupDlg; if (setupDlg.DoModal() != IDOK) { JLOG(L"user canceled setup network.\n"); break; } CAlarmCenterDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } else if (nResponse == -1) { TRACE(L"Warning: dialog creation failed, so application is terminating unexpectedly.\n"); TRACE(L"Warning: if you are using MFC controls on the dialog, you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n"); } } while (false); //video::ezviz::sdk_mgr_ezviz::release_singleton(); // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }
// Called from MyApp() immediately upon entry to MyApp::OnInit() void OCPNPlatform::Initialize_1( void ) { #ifdef OCPN_USE_CRASHRPT #ifndef _DEBUG // Install Windows crash reporting CR_INSTALL_INFO info; memset(&info, 0, sizeof(CR_INSTALL_INFO)); info.cb = sizeof(CR_INSTALL_INFO); info.pszAppName = _T("OpenCPN"); wxString version_crash = str_version_major + _T(".") + str_version_minor + _T(".") + str_version_patch; info.pszAppVersion = version_crash.c_str(); int type = MiniDumpWithDataSegs; // Include the data sections from all loaded modules. // This results in the inclusion of global variables type |= MiniDumpNormal;// | MiniDumpWithPrivateReadWriteMemory | MiniDumpWithIndirectlyReferencedMemory; info.uMiniDumpType = (MINIDUMP_TYPE)type; // Install all available exception handlers.... info.dwFlags = CR_INST_ALL_POSSIBLE_HANDLERS; // Except memory allocation failures info.dwFlags &= ~CR_INST_NEW_OPERATOR_ERROR_HANDLER; // Allow user to attach files info.dwFlags |= CR_INST_ALLOW_ATTACH_MORE_FILES; // Allow user to add more info info.dwFlags |= CR_INST_SHOW_ADDITIONAL_INFO_FIELDS; // URL for sending error reports over HTTP. if(g_bEmailCrashReport){ info.pszEmailTo = _T("*****@*****.**"); info.pszSmtpProxy = _T("mail.bigdumboat.com:587"); info.pszUrl = _T("http://bigdumboat.com/crashrpt/ocpn_crashrpt.php"); info.uPriorities[CR_HTTP] = 1; // First try send report over HTTP } else{ info.dwFlags |= CR_INST_DONT_SEND_REPORT; info.uPriorities[CR_HTTP] = CR_NEGATIVE_PRIORITY; // don't send at all } info.uPriorities[CR_SMTP] = CR_NEGATIVE_PRIORITY; // Second try send report over SMTP info.uPriorities[CR_SMAPI] = CR_NEGATIVE_PRIORITY; //1; // Third try send report over Simple MAPI wxStandardPaths& crash_std_path = g_Platform->GetStdPaths(); wxString crash_rpt_save_locn = crash_std_path.GetConfigDir(); if( g_bportable ) { wxFileName exec_path_crash( crash_std_path.GetExecutablePath() ); crash_rpt_save_locn = exec_path_crash.GetPath( wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR ); } wxString locn = crash_rpt_save_locn + _T("\\CrashReports"); if(!wxDirExists( locn ) ) wxMkdir( locn ); if(wxDirExists( locn ) ){ wxCharBuffer buf = locn.ToUTF8(); wchar_t wlocn[256]; if(buf && (locn.Length() < sizeof(wlocn)) ){ MultiByteToWideChar( 0, 0, buf.data(), -1, wlocn, sizeof(wlocn)-1); info.pszErrorReportSaveDir = (LPCWSTR)wlocn; } } // Provide privacy policy URL wxFileName exec_path_crash( crash_std_path.GetExecutablePath() ); wxString policy_file = exec_path_crash.GetPath( wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR ); policy_file += _T("PrivacyPolicy.txt"); policy_file.Prepend(_T("file:")); info.pszPrivacyPolicyURL = policy_file.c_str();; int nResult = crInstall(&info); if(nResult!=0) { TCHAR buff[256]; crGetLastErrorMsg(buff, 256); MessageBox(NULL, buff, _T("crInstall error, Crash Reporting disabled."), MB_OK); } // Establish the crash callback function crSetCrashCallback( CrashCallback, NULL ); // Take screenshot of the app window at the moment of crash crAddScreenshot2(CR_AS_PROCESS_WINDOWS|CR_AS_USE_JPEG_FORMAT, 95); // Mark some files to add to the crash report wxString home_data_crash = crash_std_path.GetConfigDir(); if( g_bportable ) { wxFileName f( crash_std_path.GetExecutablePath() ); home_data_crash = f.GetPath(); } appendOSDirSlash( &home_data_crash ); wxString config_crash = _T("opencpn.ini"); config_crash.Prepend( home_data_crash ); crAddFile2( config_crash.c_str(), NULL, NULL, CR_AF_MISSING_FILE_OK | CR_AF_ALLOW_DELETE ); wxString log_crash = _T("opencpn.log"); log_crash.Prepend( home_data_crash ); crAddFile2( log_crash.c_str(), NULL, NULL, CR_AF_MISSING_FILE_OK | CR_AF_ALLOW_DELETE ); #endif #endif #ifdef LINUX_CRASHRPT #if wxUSE_ON_FATAL_EXCEPTION // fatal exceptions handling wxHandleFatalExceptions (true); #endif #endif #ifdef __WXMSW__ // Invoke my own handler for failures of malloc/new _set_new_handler( MyNewHandler ); // configure malloc to call the New failure handler on failure _set_new_mode(1); #endif // On MSW, force the entire process to run on one CPU core only // This resolves some difficulty with wxThread syncronization #if 0 #ifdef __WXMSW__ //Gets the current process handle HANDLE hProc = GetCurrentProcess(); DWORD procMask; DWORD sysMask; HANDLE hDup; DuplicateHandle( hProc, hProc, hProc, &hDup, 0, FALSE, DUPLICATE_SAME_ACCESS ); //Gets the current process affinity mask GetProcessAffinityMask( hDup, &procMask, &sysMask ); // Take a simple approach, and assume up to 4 processors DWORD newMask; if( ( procMask & 1 ) == 1 ) newMask = 1; else if( ( procMask & 2 ) == 2 ) newMask = 2; else if( ( procMask & 4 ) == 4 ) newMask = 4; else if( ( procMask & 8 ) == 8 ) newMask = 8; //Set te affinity mask for the process BOOL res = SetProcessAffinityMask( hDup, (DWORD_PTR) newMask ); if( res == 0 ) { //Error setting affinity mask!! } #endif #endif #ifdef __WXMSW__ // Handle any Floating Point Exceptions which may leak thru from other // processes. The exception filter is in cutil.c // Seems to only happen for W98 wxPlatformInfo Platform; if( Platform.GetOperatingSystemId() == wxOS_WINDOWS_9X ) SetUnhandledExceptionFilter (&MyUnhandledExceptionFilter); #endif #ifdef __WXMSW__ // _CrtSetBreakAlloc(25503); #endif #ifndef __WXMSW__ // Setup Linux SIGNAL handling, for external program control // Build the sigaction structure sa_all.sa_handler = catch_signals;// point to my handler sigemptyset(&sa_all.sa_mask);// make the blocking set // empty, so that all // other signals will be // unblocked during my handler sa_all.sa_flags = 0; sigaction(SIGUSR1, NULL, &sa_all_old);// save existing action for this signal // Register my request for some signals sigaction(SIGUSR1, &sa_all, NULL); sigaction(SIGUSR1, NULL, &sa_all_old);// inspect existing action for this signal sigaction(SIGTERM, &sa_all, NULL); sigaction(SIGTERM, NULL, &sa_all_old); #endif }
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) { // Define CrashRpt configuration parameters CR_INSTALL_INFO info; memset(&info, 0, sizeof(CR_INSTALL_INFO)); info.cb = sizeof(CR_INSTALL_INFO); info.pszAppName = _T("crashtestdummy"); info.pszAppVersion = _T("1.0.0"); info.pszEmailSubject = _T("Error Report"); info.pszEmailTo = _T("*****@*****.**"); info.uPriorities[CR_HTTP] = 3; // First try send report over HTTP info.uPriorities[CR_SMTP] = 2; // Second try send report over SMTP info.uPriorities[CR_SMAPI] = 1; // Third try send report over Simple MAPI // Install all available exception handlers info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; // Restart the app on crash info.dwFlags |= CR_INST_APP_RESTART; info.dwFlags |= CR_INST_SEND_QUEUED_REPORTS; info.pszRestartCmdLine = _T("/restart"); // Define the Privacy Policy URL info.pszPrivacyPolicyURL = _T("http://myapp.com/privacypolicy.html"); // Install crash reporting int nResult = crInstall(&info); if(nResult!=0) { // Something goes wrong. Get error message. TCHAR szErrorMsg[512] = _T(""); crGetLastErrorMsg(szErrorMsg, 512); _tprintf_s(_T("%s\n"), szErrorMsg); return 1; } // Set crash callback function crSetCrashCallback(CrashCallback, NULL); // Add our log file to the error report crAddFile2(_T("log.txt"), NULL, _T("Log File"), CR_AF_MAKE_FILE_COPY); // We want the screenshot of the entire desktop is to be added on crash crAddScreenshot2(CR_AS_VIRTUAL_SCREEN, 0); // Add a named property that means what graphics adapter is // installed on user's machine crAddProperty(_T("VideoCard"), _T("nVidia GeForce 8600 GTS")); HRESULT hRes = ::CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call instead to // make the EXE free threaded. This means that calls come in on a random RPC thread. // HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); ATLASSERT(SUCCEEDED(hRes)); // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used ::DefWindowProc(NULL, 0, 0, 0L); AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls hRes = _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); int nRet = Run(lpstrCmdLine, nCmdShow); _Module.Term(); ::CoUninitialize(); errno_t err = _tfopen_s(&g_hLog, _T("log.txt"), _T("wt")); if(err!=0 || g_hLog==NULL) { _tprintf_s(_T("Error opening log.txt\n")); return 1; // Couldn't open log file } log_write(_T("Started successfully\n")); // There is a hidden error in the main() function // Call of _tprintf_s with NULL parameter TCHAR* szFormatString = NULL; _tprintf_s(szFormatString); // Close the log file if(g_hLog!=NULL) { fclose(g_hLog); g_hLog = NULL;// Clean up handle } // Uninitialize CrashRpt before exiting the main function crUninstall(); return nRet; }