Merge pull request #1412 from esdrubal/stackframe
[mono.git] / mcs / tools / symbolicate / symbolicate.cs
1 using System;
2 using System.IO;
3 using System.Globalization;
4 using System.Text.RegularExpressions;
5
6 namespace Symbolicate
7 {
8         public class Program
9         {
10                 static Regex regex = new Regex (@"\w*at (?<MethodName>.+) \((?<MethodParams>.*)\) \[0x(?<IL>.+)\] in <filename unknown>:0");
11
12                 public static int Main (String[] args)
13                 {
14                         if (args.Length < 2) {
15                                 Console.Error.WriteLine ("Usage: symbolicate <assembly path> <input file> [lookup directories]");
16                                 return 1;
17                         }
18
19                         var assemblyPath = args [0];
20                         var inputFile = args [1];
21
22                         var locProvider = new LocationProvider ();
23
24                         for (var i = 2; i < args.Length; i++)
25                                 locProvider.AddDirectory (args [i]);
26
27                         locProvider.AddAssembly (assemblyPath);
28
29                         using (StreamReader r = new StreamReader (inputFile)) {
30                             for (var line = r.ReadLine (); line != null; line = r.ReadLine ()) {
31                                         line = SymbolicateLine (line, locProvider);
32                                         Console.WriteLine (line);
33                             }
34                         }
35
36                         return 0;
37                 }
38
39                 static string SymbolicateLine (string line, LocationProvider locProvider)
40                 {
41                         var match = regex.Match (line);
42                         if (!match.Success)
43                                 return line;
44
45                         var methodName = match.Groups ["MethodName"].Value;
46                         var methodParams = ParseParametersTypes (match.Groups ["MethodParams"].Value);
47                         var ilOffset = int.Parse (match.Groups ["IL"].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
48
49                         Location location;
50                         if (!locProvider.TryGetLocation (methodName, methodParams, ilOffset, out location))
51                                 return line;
52
53                         return line.Replace ("<filename unknown>:0", string.Format ("{0}:{1}", location.FileName, location.Line));
54                 }
55
56                 static string[] ParseParametersTypes (string parameters)
57                 {
58                         if (string.IsNullOrEmpty (parameters))
59                                 return new string [0];
60
61                         var paramsArray = parameters.Split (',');
62                         var paramsTypes = new string [paramsArray.Length];
63                         for (var i = 0; i < paramsArray.Length; i++)
64                                 paramsTypes [i] = paramsArray [i].Trim ().Split (new char[]{' '}, 2)[0];
65
66                         return paramsTypes;
67                 }
68         }
69 }