Imported Upstream version 4.6.0.150

Former-commit-id: 73e3bb1e96dd09dc931c1dfe559d2c7f7b8b02c7
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2016-08-23 13:20:38 +00:00
parent 02ac915603
commit b95516a3dd
239 changed files with 4096 additions and 1544 deletions

View File

@@ -80,8 +80,16 @@ namespace Mono
var symbolManager = new SymbolManager (msymDir, logger);
using (StreamReader r = new StreamReader (inputFile)) {
var sb = Process (r, symbolManager);
Console.Write (sb.ToString ());
for (var line = r.ReadLine (); line != null; line = r.ReadLine ()) {
StackFrameData sfData;
if (StackFrameData.TryParse (line, out sfData) &&
symbolManager.TryResolveLocation (sfData)) {
Console.WriteLine (sfData.ToString ());
continue;
}
Console.WriteLine (line);
}
}
}
@@ -94,88 +102,5 @@ namespace Mono
symbolManager.StoreSymbols (lookupDirs);
}
public static StringBuilder Process (StreamReader reader, SymbolManager symbolManager)
{
List<StackFrameData> stackFrames = new List<StackFrameData>();
List<StackTraceMetadata> metadata = new List<StackTraceMetadata>();
StringBuilder sb = new StringBuilder ();
bool linesEnded = false;
for (var line = reader.ReadLine (); line != null; line = reader.ReadLine ()) {
StackFrameData sfData;
if (!linesEnded && StackFrameData.TryParse (line, out sfData)) {
stackFrames.Add (sfData);
continue;
}
if (stackFrames.Count > 0) {
linesEnded = true;
StackTraceMetadata stMetadata;
if (StackTraceMetadata.TryParse (line, out stMetadata)) {
metadata.Add (stMetadata);
continue;
}
DumpStackTrace (symbolManager, sb, stackFrames, metadata);
// Clear lists for next stack trace
stackFrames.Clear ();
metadata.Clear ();
}
linesEnded = false;
// Append last line
sb.AppendLine (line);
}
if (stackFrames.Count > 0)
DumpStackTrace (symbolManager, sb, stackFrames, metadata);
return sb;
}
private static void DumpStackTrace (SymbolManager symbolManager, StringBuilder sb, List<StackFrameData> stackFrames, List<StackTraceMetadata> metadata)
{
string aotid = null;
var aotidMetadata = metadata.FirstOrDefault ( m => m.Id == "AOTID" );
if (aotidMetadata != null)
aotid = aotidMetadata.Value;
var linesMvid = ProcessLinesMVID (metadata);
var lineNumber = -1;
foreach (var sfData in stackFrames) {
string mvid = null;
lineNumber++;
if (!sfData.IsValid)
continue;
if (linesMvid.ContainsKey (lineNumber))
mvid = linesMvid [lineNumber];
symbolManager.TryResolveLocation (sfData, mvid, aotid);
sb.AppendLine (sfData.ToString ());
}
foreach (var m in metadata)
sb.AppendLine (m.Line);
}
private static Dictionary<int, string> ProcessLinesMVID (List<StackTraceMetadata> metadata)
{
var linesMvid = new Dictionary<int, string> ();
var mvidData = metadata.Where ( m => m.Id == "MVID" ).Select ( m => m.Value );
foreach (var m in mvidData) {
var s1 = m.Split (new char[] {' '}, 2);
var mvid = s1 [0];
var lines = s1 [1].Split (',');
foreach (var line in lines)
linesMvid.Add (int.Parse (line), mvid);
}
return linesMvid;
}
}
}