public override async Task <AnalyzerState> AnalyzeDump(DumpMetainfo dumpInfo, string analysisWorkingDir, AnalyzerState previousState) { if (dumpInfo.DumpType != DumpType.WindowsDump && dumpInfo.DumpType != DumpType.LinuxCoreDump) { return(previousState); } try { string dumpFilePath = dumpRepo.GetDumpFilePath(dumpInfo.Id); if (!File.Exists(dumpFilePath)) { dumpRepo.SetErrorMessage(dumpInfo.Id, $"Primary dump file not found (id: {dumpInfo.Id}, path: {dumpFilePath})"); return(AnalyzerState.Failed); } if (new FileInfo(dumpFilePath).Length == 0) { dumpRepo.SetErrorMessage(dumpInfo.Id, "The primary dump file is empty!"); return(AnalyzerState.Failed); } if (dumpInfo.DumpType == DumpType.WindowsDump) { await AnalyzeWindows(dumpInfo, new DirectoryInfo(analysisWorkingDir), dumpFilePath); } else if (dumpInfo.DumpType == DumpType.LinuxCoreDump) { await LinuxAnalyzationAsync(dumpInfo, new DirectoryInfo(analysisWorkingDir), dumpFilePath); } // Re-fetch dump info as it was updated dumpInfo = dumpRepo.Get(dumpInfo.Id); SDResult result = await dumpRepo.GetResultAndThrow(dumpInfo.Id); if (result != null) { return(AnalyzerState.Succeeded); } else { return(AnalyzerState.Failed); } } catch (Exception e) { Console.WriteLine(e.Message); dumpRepo.SetErrorMessage(dumpInfo.Id, e.ToString()); return(AnalyzerState.Failed); } finally { dumpInfo = dumpRepo.Get(dumpInfo.Id); if (settings.Value.DeleteDumpAfterAnalysis) { dumpRepo.DeleteDumpFile(dumpInfo.Id); } } }