Jo Shields 3c1f479b9d Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
2015-04-07 09:35:12 +01:00

69 lines
1.9 KiB
C#

using System;
using System.IO;
using System.Globalization;
using System.Text.RegularExpressions;
namespace Symbolicate
{
public class Program
{
static Regex regex = new Regex (@"\w*at (?<MethodName>.+) \((?<MethodParams>.*)\) \[0x(?<IL>.+)\] in <filename unknown>:0");
public static int Main (String[] args)
{
if (args.Length < 2) {
Console.Error.WriteLine ("Usage: symbolicate <assembly path> <input file> [lookup directories]");
return 1;
}
var assemblyPath = args [0];
var inputFile = args [1];
var locProvider = new LocationProvider ();
for (var i = 2; i < args.Length; i++)
locProvider.AddDirectory (args [i]);
locProvider.AddAssembly (assemblyPath);
using (StreamReader r = new StreamReader (inputFile)) {
for (var line = r.ReadLine (); line != null; line = r.ReadLine ()) {
line = SymbolicateLine (line, locProvider);
Console.WriteLine (line);
}
}
return 0;
}
static string SymbolicateLine (string line, LocationProvider locProvider)
{
var match = regex.Match (line);
if (!match.Success)
return line;
var methodName = match.Groups ["MethodName"].Value;
var methodParams = ParseParametersTypes (match.Groups ["MethodParams"].Value);
var ilOffset = int.Parse (match.Groups ["IL"].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
Location location;
if (!locProvider.TryGetLocation (methodName, methodParams, ilOffset, out location))
return line;
return line.Replace ("<filename unknown>:0", string.Format ("{0}:{1}", location.FileName, location.Line));
}
static string[] ParseParametersTypes (string parameters)
{
if (string.IsNullOrEmpty (parameters))
return new string [0];
var paramsArray = parameters.Split (',');
var paramsTypes = new string [paramsArray.Length];
for (var i = 0; i < paramsArray.Length; i++)
paramsTypes [i] = paramsArray [i].Trim ().Split (new char[]{' '}, 2)[0];
return paramsTypes;
}
}
}