Ejemplo n.º 1
0
        private static XDocument TryParseXmlAnnotationDocFromLogCore(
            string logXmlText,
            CompetitionState competitionState,
            string logUri, int logLine)
        {
            using (var reader = new StringReader(logXmlText))
            {
                var xmlAnnotationDoc = TryParseXmlAnnotationDoc(
                    reader,
                    true,
                    competitionState,
                    $"Log '{logUri}', line {logLine}");

                return(xmlAnnotationDoc);
            }
        }
Ejemplo n.º 2
0
            // BASEDON: http://stackoverflow.com/questions/36649271/check-that-pdb-file-matches-to-the-source
            public static bool TryGetSourceInfo(
                MethodBase method,
                CompetitionState competitionState,
                out string sourceFileName,
                out int firstCodeLine)
            {
                firstCodeLine  = -1;
                sourceFileName = null;

                var methodSymbols = TryGetMethodSymbols(method, competitionState);

                if (methodSymbols != null)
                {
                    int[] startLines;
                    ISymUnmanagedDocument[] documents;

                    if (TryGetDocsAndLines(methodSymbols, competitionState, out documents, out startLines))
                    {
                        Array.Sort(startLines, documents);
                        var doc = new SymDocument(documents[0]);

                        if (TryValidateFileHash(doc, competitionState))
                        {
                            sourceFileName = doc.Url;
                            firstCodeLine  = startLines[0];
                        }
                    }
                    else
                    {
                        // ReSharper disable once PossibleNullReferenceException
                        competitionState.WriteMessage(
                            MessageSource.Analyser, MessageSeverity.SetupError,
                            $"Method {method.DeclaringType.Name}.{method.Name}, no PDB data available.");
                    }
                }

                return(sourceFileName != null);
            }
Ejemplo n.º 3
0
            private static bool ValidateCore(
                string file,
                ConcurrentDictionary <string, byte[]> fileHashesCache,
                string hashAlgName,
                byte[] expectedChecksum, CompetitionState competitionState)
            {
                var actualChecksum = fileHashesCache.GetOrAdd(file, f => TryGetChecksum(f, hashAlgName));

                if (expectedChecksum.SequenceEqual(actualChecksum))
                {
                    return(true);
                }

                var expected = expectedChecksum.ToHexString();
                var actual   = actualChecksum.ToHexString();

                competitionState.WriteMessage(
                    MessageSource.Analyser, MessageSeverity.SetupError,
                    $"{hashAlgName} checksum validation failed. File '{file}'." +
                    $"{Environment.NewLine}\tActual: 0x{actual}" +
                    $"{Environment.NewLine}\tExpected: 0x{expected}");

                return(false);
            }
Ejemplo n.º 4
0
        public static XDocument[] TryParseXmlAnnotationDocsFromLog(
            [NotNull] string logUri,
            [NotNull] CompetitionState competitionState)
        {
            Code.NotNullNorEmpty(logUri, nameof(logUri));
            Code.NotNull(competitionState, nameof(competitionState));

            var result = new List <XDocument>();

            var logger = competitionState.Logger;

            logger.WriteLineInfo($"{LogVerbosePrefix} Downloading '{logUri}'.");

            using (var reader = BenchmarkHelpers.TryGetTextFromUri(logUri, TimeSpan.FromSeconds(15)))
            {
                if (reader == null)
                {
                    competitionState.WriteMessage(
                        MessageSource.Analyser, MessageSeverity.SetupError,
                        $"Could not load log content from '{logUri}'.");
                    return(Array <XDocument> .Empty);
                }

                logger.WriteLineInfo($"{LogVerbosePrefix} Downloaded '{logUri}'.");

                var    buffer = new StringBuilder();
                int    lineNumber = 0, xmlStartLineNumber = -1;
                string logLine;
                while ((logLine = reader.ReadLine()) != null)
                {
                    lineNumber++;

                    if (logLine.StartsWith(LogAnnotationStart, StringComparison.OrdinalIgnoreCase))
                    {
                        xmlStartLineNumber = lineNumber;
                    }
                    else if (logLine.StartsWith(LogAnnotationEnd, StringComparison.OrdinalIgnoreCase))
                    {
                        if (buffer.Length > 0)
                        {
                            var xmlAnnotationDoc = TryParseXmlAnnotationDocFromLogCore(
                                buffer.ToString(), competitionState, logUri, xmlStartLineNumber);
                            if (xmlAnnotationDoc != null)
                            {
                                result.Add(xmlAnnotationDoc);
                            }
                        }
                        buffer.Length = 0;

                        xmlStartLineNumber = -1;
                    }
                    else if (xmlStartLineNumber >= 0)
                    {
                        buffer.Append(logLine);
                    }
                }

                if (buffer.Length > 0)
                {
                    var xmlAnnotationDoc = TryParseXmlAnnotationDocFromLogCore(
                        buffer.ToString(), competitionState, logUri, xmlStartLineNumber);
                    if (xmlAnnotationDoc != null)
                    {
                        result.Add(xmlAnnotationDoc);
                    }
                }
            }

            return(result.ToArray());
        }
Ejemplo n.º 5
0
            // ReSharper disable once SuggestBaseTypeForParameter
            private static ISymUnmanagedMethod TryGetMethodSymbols(MethodBase method, CompetitionState competitionState)
            {
                try
                {
                    // ReSharper disable once PossibleNullReferenceException
                    var assembly          = method.DeclaringType.Assembly;
                    var codeBase          = new Uri(assembly.CodeBase).LocalPath;
                    var codeBaseDirectory = Path.GetDirectoryName(codeBase);

                    var dispenser = (IMetaDataDispenser) new CorMetaDataDispenser();
                    var import    = dispenser.OpenScope(codeBase, 0, typeof(IMetaDataImportStub).GUID);
                    var binder    = (ISymUnmanagedBinder) new CorSymBinder();

                    ISymUnmanagedReader reader;
                    var hr = binder.GetReaderForFile(import, codeBase, codeBaseDirectory, out reader);
                    ThrowExceptionForHR(hr);

                    ISymUnmanagedMethod methodSymbols;
                    hr = reader.GetMethod(method.MetadataToken, out methodSymbols);
                    ThrowExceptionForHR(hr);
                    return(methodSymbols);
                }
                catch (COMException ex)
                {
                    // ReSharper disable once PossibleNullReferenceException
                    competitionState.WriteExceptionMessage(
                        MessageSource.Analyser, MessageSeverity.ExecutionError,
                        $"Method {method.DeclaringType.Name}.{method.Name}, no PDB data available.", ex);

                    return(null);
                }
            }