Exemple #1
0
        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);
                }
            }
        }