3 using System.Globalization;
4 using System.Text.RegularExpressions;
10 static Regex regex = new Regex (@"\w*at (?<MethodName>.+) \((?<MethodParams>.*)\) \[0x(?<IL>.+)\] in <filename unknown>:0");
12 public static int Main (String[] args)
14 if (args.Length < 2) {
15 Console.Error.WriteLine ("Usage: symbolicate <assembly path> <input file> [lookup directories]");
19 var assemblyPath = args [0];
20 var inputFile = args [1];
22 var locProvider = new LocationProvider ();
24 for (var i = 2; i < args.Length; i++)
25 locProvider.AddDirectory (args [i]);
27 locProvider.AddAssembly (assemblyPath);
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);
39 static string SymbolicateLine (string line, LocationProvider locProvider)
41 var match = regex.Match (line);
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);
50 if (!locProvider.TryGetLocation (methodName, methodParams, ilOffset, out location))
53 return line.Replace ("<filename unknown>:0", string.Format ("{0}:{1}", location.FileName, location.Line));
56 static string[] ParseParametersTypes (string parameters)
58 if (string.IsNullOrEmpty (parameters))
59 return new string [0];
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];