private static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Usage: dumppdb PDBFILE"); Console.WriteLine("Dumps the parsed symbols from the given PDBFILE in CSV format."); return; } string pdbFile = args[0]; string assemblyName = Path.GetFileNameWithoutExtension(pdbFile); MethodMapper mapper = new MethodMapper(); AssemblyMethodMappings assemblyMappings = mapper.GetMethodMappings(pdbFile, assemblyName); // sorts the elements by source file and then line number since OrderBy guarantees a stable sort IEnumerable <MethodMapping> sortedMappings = assemblyMappings.MethodMappings.OrderBy(mapping => mapping.StartLine) .OrderBy(mapping => mapping.SourceFile); Console.WriteLine("MethodToken, StartLine, EndLine, SourceFile"); foreach (MethodMapping mapping in assemblyMappings.MethodMappings) { // we pad all fields to the length of the corresponding header plus the comma to align // the fields nicely on the console for easy readability // the source file is the last field because we cannot pad it to a fixed length string tokenField = $"{mapping.MethodToken},".PadRight(12); string startLineField = $"{mapping.StartLine},".PadRight(10); string endLineField = $"{mapping.EndLine},".PadRight(8); Console.WriteLine($"{tokenField} {startLineField} {endLineField} {mapping.SourceFile}"); } }
public void CompilerHiddenLinesShouldBeIgnored() { ParsedTraceFile traceFile = new ParsedTraceFile(new string[] { "Assembly=Test:2 Version:1.0.0.0", "Inlined=2:1234", }, "coverage_12345_1234.txt"); AssemblyMethodMappings mappings = new AssemblyMethodMappings { AssemblyName = "Test", SymbolFileName = "Test.pdb", }; mappings.MethodMappings.Add(new MethodMapping { MethodToken = 1234, SourceFile = "", StartLine = 16707566, EndLine = 16707566, }); mappings.MethodMappings.Add(new MethodMapping { MethodToken = 1234, SourceFile = @"c:\some\file.cs", StartLine = 16707566, EndLine = 16707566, }); SymbolCollection symbolCollection = new SymbolCollection(new List <AssemblyMethodMappings>() { mappings }); Dictionary <string, FileCoverage> coverage = LineCoverageSynthesizer.ConvertToLineCoverage(traceFile, symbolCollection, TestUtils.TestDataDirectory, new GlobPatternList(new List <string> { "*" }, new List <string> { })); Assert.That(coverage, Is.Empty); }
/// <summary> /// Creates a symbol collection from the given PDB files. /// </summary> public static SymbolCollection CreateFromFiles(IEnumerable <string> pdbFilePaths) { MethodMapper mapper = new MethodMapper(); List <AssemblyMethodMappings> mappings = new List <AssemblyMethodMappings>(); foreach (string filePath in pdbFilePaths) { logger.Debug("Loading mappings from PDB {filePath}", filePath); string assemblyName = Path.GetFileNameWithoutExtension(filePath); try { AssemblyMethodMappings assemblyMappings = mapper.GetMethodMappings(filePath, assemblyName); mappings.Add(assemblyMappings); } catch (Exception e) { logger.Error(e, "Failed to parse PDB file {pdbFile}. This file will be ignored and no coverage will be reported for its corresponding assembly." + " You may get follow-up errors that method IDs cannot be resolved for this assembly", filePath); } } return(new SymbolCollection(mappings)); }