3 using Mono
.CompilerServices
.SymbolWriter
;
7 using System
.Globalization
;
11 public static int Main (String
[] args
)
13 if (args
.Length
< 1) {
14 Console
.Error
.WriteLine ("Usage: mdbdump <assembly>");
18 using (var assembly
= AssemblyDefinition
.ReadAssembly (args
[0])) {
20 var f
= MonoSymbolFile
.ReadSymbolFile (args
[0] + ".mdb");
21 DumpSymbolFile (assembly
, f
, Console
.Out
);
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
;
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 ();