Пример #1
0
 /// <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);
     }
 }
Пример #2
0
        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);
        }