unsigned long CrashFilter(LPEXCEPTION_POINTERS pException, int exceptionCode) { unsigned long result; if ((result = UnhandledExceptionFilter(pException)) != EXCEPTION_EXECUTE_HANDLER) { return result; } else if (avmthane::show_error) { // if -error option dont do a dump return EXCEPTION_CONTINUE_SEARCH; } AvmLog("avmplus crash: exception 0x%08lX occurred\n", exceptionCode); typedef BOOL (WINAPI *MINIDUMP_WRITE_DUMP)( HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam ); HMODULE hDbgHelp = LoadLibrary("dbghelp.dll"); MINIDUMP_WRITE_DUMP MiniDumpWriteDump_ = (MINIDUMP_WRITE_DUMP)GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); if (MiniDumpWriteDump_) { MINIDUMP_EXCEPTION_INFORMATION M; const char DumpPath[] = "avmplusCrash.dmp"; M.ThreadId = GetCurrentThreadId(); M.ExceptionPointers = pException; M.ClientPointers = 0; AvmLog("Writing minidump crash log to %s\n", DumpPath); HANDLE hDumpFile = CreateFile(DumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); MiniDumpWriteDump_(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, (pException) ? &M : NULL, NULL, NULL); CloseHandle(hDumpFile); } else { AvmLog("minidump not available, no crash log written.\n"); } return result; }
void WordcodeTranslator::swprofStart() { swprof_code_fp = fopen("superwordprof_code.txt", "wb"); if (swprof_code_fp == NULL) AvmLog("SUPERWORD PROFILING: COULD NOT OPEN CODE FILE.\n"); else { unsigned int signature = 0xC0DEC0DE; fwrite(&signature, sizeof(uint32_t), 1, swprof_code_fp); } swprof_sample_fp = fopen("superwordprof_sample.txt", "wb"); if (swprof_sample_fp == NULL) AvmLog("SUPERWORD PROFILING: COULD NOT OPEN SAMPLE FILE.\n"); else { unsigned int signature = 0xDA1ADA1A; fwrite(&signature, sizeof(uint32_t), 1, swprof_sample_fp); } }
WinPlatform() { // Increase the accuracy of getTimer and Date to 1 ms from the 16 ms default timeBeginPeriod(1); // Initialize WSAStartup() only once if( !WinSocket::Setup() ) { AvmLog("Failed to initialize Winsock.\n"); printf("Failed to initialize Winsock.\n"); } }
void WordcodeTranslator::swprofPC(const uint32_t* pc) { if (swprof_sample_fp != NULL) { fwrite(&pc, sizeof(uint32_t*), 1, swprof_sample_fp); #ifdef SUPERWORD_LIMIT if (++sample_count == SUPERWORD_LIMIT) { swprofStop(); AvmLog("SAMPLING HALTED.\n"); } #endif } }
void WinPlatform::initializeLogging(const char* filename) { #if defined (UNDER_CE) int filenameLen = VMPI_strlen(filename); TCHAR* logname = new TCHAR[filenameLen+1]; mbstowcs(logname, filename, filenameLen+1); _wfreopen(logname, L"w", stdout); delete [] logname; #else FILE *f = freopen(filename, "w", stdout); if (!f) AvmLog("freopen %s failed.\n",filename); #endif /* UNDER_CE */ }