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

@ -178,6 +178,20 @@ namespace System.Diagnostics {
return frames;
}
static bool isAotidSet;
static string aotid;
static string GetAotId ()
{
if (!isAotidSet) {
aotid = Assembly.GetAotId ();
if (aotid != null)
aotid = new Guid (aotid).ToString ("N");
isAotidSet = true;
}
return aotid;
}
bool AddFrames (StringBuilder sb)
{
bool printOffset;
@ -215,8 +229,18 @@ namespace System.Diagnostics {
sb.AppendFormat (" [0x{0:x5}]", frame.GetILOffset ());
}
sb.AppendFormat (debugInfo, frame.GetSecureFileName (),
frame.GetFileLineNumber ());
var filename = frame.GetSecureFileName ();
if (filename[0] == '<') {
var mvid = frame.GetMethod ().Module.ModuleVersionId.ToString ("N");
var aotid = GetAotId ();
if (frame.GetILOffset () != -1 || aotid == null) {
filename = string.Format ("<{0}>", mvid);
} else {
filename = string.Format ("<{0}#{1}>", mvid, aotid);
}
}
sb.AppendFormat (debugInfo, filename, frame.GetFileLineNumber ());
}
}
@ -287,8 +311,6 @@ namespace System.Diagnostics {
if (!t.AddFrames (sb))
continue;
t.AddMetadata (sb);
sb.Append (Environment.NewLine);
sb.Append ("--- End of stack trace from previous location where exception was thrown ---");
sb.Append (Environment.NewLine);
@ -296,78 +318,14 @@ namespace System.Diagnostics {
}
AddFrames (sb);
AddMetadata (sb);
return sb.ToString ();
}
void AddMetadata (StringBuilder sb)
{
if (metadataHandlers == null)
InitMetadataHandlers ();
foreach (var handler in metadataHandlers) {
var lines = handler.Value (this);
using (var reader = new StringReader (lines)) {
string line;
while ((line = reader.ReadLine()) != null) {
sb.AppendLine ();
sb.AppendFormat ("[{0}] {1}", handler.Key, line);
}
}
}
}
internal String ToString (TraceFormat traceFormat)
{
// TODO:
return ToString ();
}
static void InitMetadataHandlers ()
{
metadataHandlers = new Dictionary<string, Func<StackTrace, string>> (StringComparer.Ordinal);
var aotid = Assembly.GetAotId ();
if (aotid != null)
AddMetadataHandler ("AOTID", st => { return new Guid (aotid).ToString ("N"); });
AddMetadataHandler ("MVID", st => {
var mvidLines = new Dictionary<Guid, List<int>> ();
var frames = st.GetFrames ();
for (var lineNumber = 0; lineNumber < frames.Length; lineNumber++) {
var method = frames[lineNumber].GetMethod ();
if (method == null)
continue;
var mvid = method.Module.ModuleVersionId;
List<int> lines = null;
if (!mvidLines.TryGetValue (mvid, out lines)) {
lines = new List<int> ();
mvidLines.Add (mvid, lines);
}
lines.Add (lineNumber);
}
var mvids = new List<Guid> (mvidLines.Keys);
mvids.Sort ();
var sb = new StringBuilder ();
foreach (var mvid in mvids)
sb.AppendLine (string.Format ("{0} {1}", mvid.ToString ("N"), string.Join (",", mvidLines[mvid])));
return sb.ToString ();
});
}
// This method signature should not change, apps can use it with reflection to add custom metadata handlers.
private static void AddMetadataHandler (string id, Func<StackTrace, string> handler)
{
if (metadataHandlers == null)
InitMetadataHandlers ();
metadataHandlers.Add (id, handler);
}
}
}