/// <summary> /// Finalizes report files. /// Thread-safe. /// </summary> private void FinalizeReport(AddReportResult AddResult, DirectoryInfo DirInfo, FGenericCrashContext NewContext) { // Only remove if we added the report, otherwise leave all files to further investigation. if (AddResult == AddReportResult.Added) { // Remove the report files as we're done with them. CleanReport(DirInfo); } else if (AddResult == AddReportResult.Failed) { MoveReportToInvalid(NewContext.CrashDirectory, ReportQueueBase.GetSafeFilename(NewContext.GetAsFilename())); } else // AddResult == AddReportResult.Cancelled { // Remove report from index of completed reports and leave on disk CrashReporterProcessServicer.ReportIndex.TryRemoveReport(NewContext.CrashDirectory); } }
double ReadProcessAddReport(DirectoryInfo DirInfo, FGenericCrashContext NewContext) { try { string DumpFileName = null; string LogFileName = null; string DiagnosticsFileName = ""; string VideoFileName = null; string CrashContextName = ""; foreach (FileInfo Info in DirInfo.GetFiles()) { switch (Info.Extension.ToLower()) { case ".avi": case ".mp4": VideoFileName = Info.Name; break; case ".runtime-xml": CrashContextName = Info.Name; break; case ".log": LogFileName = Info.Name; break; case ".txt": if (string.Compare(Info.Name, CrashReporterConstants.DiagnosticsFileName, true) == 0) { DiagnosticsFileName = Info.Name; ReadDiagnosticsFile(NewContext); } break; case ".dmp": case ".mdmp": DumpFileName = Info.Name; // Check to see if this has been processed locally FileInfo DiagnosticsInfo = new FileInfo(Path.Combine(DirInfo.FullName, CrashReporterConstants.DiagnosticsFileName)); if (!DiagnosticsInfo.Exists && !NewContext.HasProcessedData()) { ProcessDumpFile(Info.FullName, NewContext); } // Check to see if a new one has been created DiagnosticsInfo.Refresh(); if (DiagnosticsInfo.Exists) { DiagnosticsFileName = DiagnosticsInfo.Name; } break; default: break; } } // Check if the new context has processed data. if (!NewContext.HasProcessedData()) { CrashReporterProcessServicer.WriteEvent(string.Format("PROC-{0} ", ProcessorIndex) + "% Warning no callstack or error msg : BuiltFromCL=" + string.Format("{0,7}", NewContext.PrimaryCrashProperties.EngineVersion) + " Path=" + NewContext.CrashDirectory); NewContext.PrimaryCrashProperties.ProcessorFailedMessage = "No callstack or error message. Diagnostics missing or failed."; } Stopwatch WaitSW = Stopwatch.StartNew(); // Wait for previous task, should not really happen. int AddReportTaskSlot = WaitForFreeAddReportTask(); CrashReporterProcessServicer.WriteEvent(string.Format("PROC-{0} ", ProcessorIndex) + string.Format("Starting AddReportTask running on slot {0} of {1} ({2} active)", AddReportTaskSlot, Config.Default.AddReportsPerProcessor, GetActiveAddReportTasks())); double WaitTime = WaitSW.Elapsed.TotalSeconds; //bool bAdded = AddReport(DirInfo, NewContext, LogFileName, DumpFileName, VideoFileName ); // Save/update crash context to the file. NewContext.ToFile(); AddReportTasks[AddReportTaskSlot] = Task.Factory.StartNew(() => { AddReportResult Result = AddReport(DirInfo, NewContext, LogFileName, DumpFileName, VideoFileName); FinalizeReport(Result, DirInfo, NewContext); }); return(WaitTime); } catch (Exception Ex) { CrashReporterProcessServicer.WriteException(string.Format("PROC-{0} ", ProcessorIndex) + "ProcessReport: " + NewContext.CrashDirectory + "\n\n: " + Ex, Ex); } return(0.0); }