[sgen] Don't trigger collections during allocation of thread objects (#17970)
[mono-project.git] / mcs / tools / mdbdump / mdbdump.cs
blob2d5cdeaf742f8119c9f2e20f8b35be734cb739d4
1 using System;
2 using System.IO;
3 using Mono.CompilerServices.SymbolWriter;
4 using Mono.Cecil;
5 using System.Text;
6 using System.Xml;
7 using System.Globalization;
9 public class MdbDump
11 public static int Main (String[] args)
13 if (args.Length < 1) {
14 Console.Error.WriteLine ("Usage: mdbdump <assembly>");
15 return 1;
18 using (var assembly = AssemblyDefinition.ReadAssembly (args[0])) {
20 var f = MonoSymbolFile.ReadSymbolFile (args[0] + ".mdb");
21 DumpSymbolFile (assembly, f, Console.Out);
24 return 0;
27 static string ChecksumToString (byte[] checksum)
29 var sb = new StringBuilder (checksum.Length * 2);
30 for (int i = 0; i < checksum.Length; i++) {
31 sb.Append ("0123456789abcdef"[checksum[i] >> 4]);
32 sb.Append ("0123456789abcdef"[checksum[i] & 0x0F]);
35 return sb.ToString ();
38 static string IntToHex (int value)
40 return "0x" + value.ToString ("x", CultureInfo.InvariantCulture);
43 static void DumpSymbolFile (AssemblyDefinition assembly, MonoSymbolFile symbolFile, TextWriter output)
45 using (XmlTextWriter writer = new XmlTextWriter (output)) {
46 writer.Formatting = Formatting.Indented;
48 writer.WriteStartDocument ();
50 writer.WriteStartElement ("symbols");
51 writer.WriteAttributeString ("guid", symbolFile.Guid.ToString ());
53 writer.WriteStartElement ("files");
54 foreach (var file in symbolFile.Sources) {
55 writer.WriteStartElement ("file");
56 writer.WriteAttributeString ("id", file.Index.ToString ());
57 writer.WriteAttributeString ("name", Path.GetFileName (file.FileName));
58 var checksum = file.Checksum;
59 if (checksum != null)
60 writer.WriteAttributeString ("checksum", ChecksumToString (checksum));
62 writer.WriteEndElement ();
64 writer.WriteEndElement ();
66 writer.WriteStartElement ("methods");
67 foreach (var method in symbolFile.Methods) {
68 writer.WriteStartElement ("method");
69 writer.WriteAttributeString ("token", IntToHex (method.Token));
70 writer.WriteAttributeString ("signature", assembly.MainModule.LookupToken (method.Token).ToString ());
72 var il_entries = method.GetLineNumberTable ();
73 writer.WriteStartElement ("sequencepoints");
74 foreach (var entry in il_entries.LineNumbers) {
75 writer.WriteStartElement ("entry");
76 writer.WriteAttributeString ("il", IntToHex (entry.Offset));
77 writer.WriteAttributeString ("row", entry.Row.ToString ());
78 writer.WriteAttributeString ("col", entry.Column.ToString ());
79 if (entry.EndRow != -1 || entry.EndColumn != -1) {
80 writer.WriteAttributeString ("end_row", entry.EndRow.ToString ());
81 writer.WriteAttributeString ("end_col", entry.EndColumn.ToString ());
83 writer.WriteAttributeString ("file_ref", entry.File.ToString ());
84 writer.WriteEndElement ();
86 writer.WriteEndElement ();
88 writer.WriteStartElement ("locals");
89 foreach (var local in method.GetLocals ()) {
90 writer.WriteStartElement ("entry");
91 writer.WriteAttributeString ("name", local.Name);
92 writer.WriteAttributeString ("il_index", local.Index.ToString ());
93 writer.WriteAttributeString ("scope_ref", local.BlockIndex.ToString ());
94 writer.WriteEndElement ();
96 writer.WriteEndElement ();
98 writer.WriteStartElement ("scopes");
99 foreach (var scope in method.GetCodeBlocks ()) {
100 writer.WriteStartElement ("entry");
101 writer.WriteAttributeString ("index", scope.Index.ToString ());
102 writer.WriteAttributeString ("start", IntToHex (scope.StartOffset));
103 writer.WriteAttributeString ("end", IntToHex (scope.EndOffset));
104 writer.WriteEndElement ();
106 writer.WriteEndElement ();
108 writer.WriteEndElement ();
110 writer.WriteEndElement ();
112 writer.WriteEndElement ();
113 writer.WriteEndDocument ();