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); } }
// 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); }
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); }
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()); }
// 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); } }