int dumpAll(struct file *f, struct task_struct *tsk) { mm_segment_t fs; int vmareas, openfiles, pagessofar; struct pt_regs prset; printk(KERN_INFO "\nDumpStructure():Dumping structure....................\n"); prset=GetRegisters(tsk); fs=get_fs(); dumpHeader(f,tsk,&vmareas,&openfiles,&pagessofar); dumpTaskStructure(f,tsk); dumpMMStructure(f,tsk); DumpVMAreas(f,tsk,fs); DumpRegisters(f,prset); kwrite(f,NULL,0); set_fs(fs); return 1; }
/** * Handles the getregisters sub-command. * * @returns Suitable exit code. * @param pArgs The handler arguments. * @param pDebugger Pointer to the debugger interface. */ static RTEXITCODE handleDebugVM_GetRegisters(HandlerArg *pArgs, IMachineDebugger *pDebugger) { /* * We take a list of register names (case insensitive). If 'all' is * encountered we'll dump all registers. */ ULONG idCpu = 0; unsigned cRegisters = 0; RTGETOPTSTATE GetState; RTGETOPTUNION ValueUnion; static const RTGETOPTDEF s_aOptions[] = { { "--cpu", 'c', RTGETOPT_REQ_UINT32 }, }; int rc = RTGetOptInit(&GetState, pArgs->argc, pArgs->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, RTGETOPTINIT_FLAGS_OPTS_FIRST); AssertRCReturn(rc, RTEXITCODE_FAILURE); while ((rc = RTGetOpt(&GetState, &ValueUnion)) != 0) { switch (rc) { case 'c': idCpu = ValueUnion.u32; break; case VINF_GETOPT_NOT_OPTION: if (!RTStrICmp(ValueUnion.psz, "all")) { com::SafeArray<BSTR> aBstrNames; com::SafeArray<BSTR> aBstrValues; CHECK_ERROR2I_RET(pDebugger, GetRegisters(idCpu, ComSafeArrayAsOutParam(aBstrNames), ComSafeArrayAsOutParam(aBstrValues)), RTEXITCODE_FAILURE); Assert(aBstrNames.size() == aBstrValues.size()); size_t cchMaxName = 8; for (size_t i = 0; i < aBstrNames.size(); i++) { size_t cchName = RTUtf16Len(aBstrNames[i]); if (cchName > cchMaxName) cchMaxName = cchName; } for (size_t i = 0; i < aBstrNames.size(); i++) RTPrintf("%-*ls = %ls\n", cchMaxName, aBstrNames[i], aBstrValues[i]); } else { com::Bstr bstrName = ValueUnion.psz; com::Bstr bstrValue; CHECK_ERROR2I_RET(pDebugger, GetRegister(idCpu, bstrName.raw(), bstrValue.asOutParam()), RTEXITCODE_FAILURE); RTPrintf("%s = %ls\n", ValueUnion.psz, bstrValue.raw()); } cRegisters++; break; default: return errorGetOpt(rc, &ValueUnion); } } if (!cRegisters) return errorSyntax("The getregisters sub-command takes at least one register name"); return RTEXITCODE_SUCCESS; }
bool ErrorReport::GetMiscCrashInfo() { // Get crash time m_CrashDateTime = QDateTime::currentDateTime(); m_ProcessArchitecture = ARX_ARCH_NAME; m_OSName = QString::fromUtf8(platform::getOSName().c_str()); m_OSArchitecture = QString::fromUtf8(platform::getOSArchitecture().c_str()); m_OSDistribution = QString::fromUtf8(platform::getOSDistribution().c_str()); #if ARX_PLATFORM == ARX_PLATFORM_WIN32 // Open parent process handle HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_pCrashInfo->processId); if(hProcess != NULL) { // Get memory usage info PROCESS_MEMORY_COUNTERS meminfo; BOOL bGetMemInfo = GetProcessMemoryInfo(hProcess, &meminfo, sizeof(PROCESS_MEMORY_COUNTERS)); if(bGetMemInfo) m_ProcessMemoryUsage = meminfo.WorkingSetSize; // Determine the period of time the process is working. FILETIME CreationTime, ExitTime, KernelTime, UserTime; BOOL bGetTimes = GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime); if(bGetTimes) { SYSTEMTIME AppStartTime; FileTimeToSystemTime(&CreationTime, &AppStartTime); SYSTEMTIME CurTime; GetSystemTime(&CurTime); ULONG64 uCurTime = ConvertSystemTimeToULONG64(CurTime); ULONG64 uStartTime = ConvertSystemTimeToULONG64(AppStartTime); // Check that the application works for at least one minute before crash. // This might help to avoid cyclic error report generation when the applciation // crashes on startup. m_RunningTimeSec = (double)(uCurTime-uStartTime)*10E-08; } } else { m_DetailedError = QString("Unable to obtain an handle to the crashed process (Error %1).").arg(QString::number(GetLastError())); return false; } if(m_pCrashInfo->exceptionCode != 0) { QString exceptionStr = GetExceptionString(m_pCrashInfo->exceptionCode).c_str(); if(!exceptionStr.isEmpty()) { m_ReportDescription += "\nException code:\n "; m_ReportDescription += exceptionStr; m_ReportDescription += "\n"; } } std::string callStack, callstackTop; u32 callstackCrc; bool bCallstack = GetCallStackInfo(hProcess, m_pCrashInfo->threadHandle, &m_pCrashInfo->contextRecord, callStack, callstackTop, callstackCrc); if(!bCallstack) { m_DetailedError = "A failure occured when obtaining information regarding the callstack."; return false; } m_ReportUniqueID = QString("[%1]").arg(QString::number(callstackCrc, 16).toUpper()); m_ReportDescription = m_pCrashInfo->detailedCrashInfo; m_ReportDescription += "\nCallstack:\n"; m_ReportDescription += callStack.c_str(); m_ReportTitle = QString("%1 %2").arg(m_ReportUniqueID, callstackTop.c_str()); QString registers(GetRegisters(&m_pCrashInfo->contextRecord).c_str()); if(!registers.isEmpty()) { m_ReportDescription += "\nRegisters:\n"; m_ReportDescription += registers; } CloseHandle(hProcess); m_ReportDescriptionText = m_ReportDescription; #else // ARX_PLATFORM != ARX_PLATFORM_WIN32 getResourceUsage(m_pCrashInfo->processId, m_ProcessMemoryUsage, m_RunningTimeSec); #endif return true; }
/* Callback for the exception handler * Parameters: * e - The exception information * Returns: * EXCEPTION_EXECUTE_HANDLER to terminate the process * Side Effects: * unrealircd.PID.core is created * If not running in service mode, a message box is displayed, * else output is written to service.log */ LONG __stdcall ExceptionFilter(EXCEPTION_POINTERS *e) { MEMORYSTATUS memStats; char file[512], text[1024], minidumpf[512]; FILE *fd; time_t timet = time(NULL); #ifndef NOMINIDUMP HANDLE hDump; HMODULE hDll = NULL; #endif sprintf(file, "unrealircd.%d.core", getpid()); fd = fopen(file, "w"); GlobalMemoryStatus(&memStats); fprintf(fd, "Generated at %s\n%s (%d.%d.%d)\n%s[%s%s%s] (%s)\n" "-----------------\nMemory Information:\n" "\tPhysical: (Available:%ldMB/Total:%ldMB)\n" "\tVirtual: (Available:%ldMB/Total:%ldMB)\n" "-----------------\nException:\n\t%s\n-----------------\n" "Backup Buffer:\n\t%s\n-----------------\nRegisters:\n" "%s-----------------\nStack Trace:\n%s", asctime(gmtime(&timet)), OSName, VerInfo.dwMajorVersion, VerInfo.dwMinorVersion, VerInfo.dwBuildNumber, IRCDTOTALVERSION, serveropts, extraflags ? extraflags : "", tainted ? "3" : "", buildid, memStats.dwAvailPhys/1048576, memStats.dwTotalPhys/1048576, memStats.dwAvailVirtual/1048576, memStats.dwTotalVirtual/1048576, GetException(e->ExceptionRecord->ExceptionCode), backupbuf, GetRegisters(e->ContextRecord), StackTrace(e)); sprintf(text, "UnrealIRCd has encountered a fatal error. Debugging information has been dumped to %s.", file); fclose(fd); #ifndef NOMINIDUMP hDll = LoadLibrary("DBGHELP.DLL"); if (hDll) { MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)GetProcAddress(hDll, "MiniDumpWriteDump"); if (pDump) { MINIDUMP_EXCEPTION_INFORMATION ExInfo; sprintf(minidumpf, "unrealircd.%d.mdmp", getpid()); hDump = CreateFile(minidumpf, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hDump != INVALID_HANDLE_VALUE) { ExInfo.ThreadId = GetCurrentThreadId(); ExInfo.ExceptionPointers = e; ExInfo.ClientPointers = 0; if (pDump(GetCurrentProcess(), GetCurrentProcessId(), hDump, MiniDumpNormal, &ExInfo, NULL, NULL)) { sprintf(text, "UnrealIRCd has encountered a fatal error. Debugging information has been dumped to %s and %s.", file, minidumpf); } CloseHandle(hDump); } sprintf(minidumpf, "unrealircd.%d.full.mdmp", getpid()); hDump = CreateFile(minidumpf, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hDump != INVALID_HANDLE_VALUE) { ExInfo.ThreadId = GetCurrentThreadId(); ExInfo.ExceptionPointers = e; ExInfo.ClientPointers = 0; CloseHandle(hDump); } } } #endif if (!IsService) { MessageBox(NULL, text, "Fatal Error", MB_OK); StartCrashReporter(); } else { FILE *fd = fopen("service.log", "a"); if (fd) { fprintf(fd, "UnrealIRCd has encountered a fatal error. Debugging information " "has been dumped to unrealircd.%d.core, please file a bug and upload " "this file to http://bugs.unrealircd.org/.", getpid()); fclose(fd); } } CleanUp(); return EXCEPTION_EXECUTE_HANDLER; }