You've already forked linux-packaging-mono
Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
parent
a569aebcfd
commit
e79aa3c0ed
@@ -37,6 +37,7 @@ using System.Security;
|
||||
using System.Security.Permissions;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.IO;
|
||||
|
||||
namespace System.Diagnostics {
|
||||
|
||||
@@ -60,6 +61,9 @@ namespace System.Diagnostics {
|
||||
readonly StackTrace[] captured_traces;
|
||||
private bool debug_info;
|
||||
|
||||
private static Dictionary<string, Func<StackTrace, string>> metadataHandlers;
|
||||
|
||||
[MethodImplAttribute (MethodImplOptions.NoInlining)]
|
||||
public StackTrace ()
|
||||
{
|
||||
init_frames (METHODS_TO_SKIP, false);
|
||||
@@ -219,17 +223,14 @@ namespace System.Diagnostics {
|
||||
return i != 0;
|
||||
}
|
||||
|
||||
// This method is also used with reflection by mono-symbolicate tool.
|
||||
// mono-symbolicate tool uses this method to check which method matches
|
||||
// the stack frame method signature.
|
||||
static void GetFullNameForStackTrace (StringBuilder sb, MethodBase mi)
|
||||
public static void GetFullNameForStackTrace (StringBuilder sb, MethodBase mi)
|
||||
{
|
||||
var declaringType = mi.DeclaringType;
|
||||
if (declaringType.IsGenericType && !declaringType.IsGenericTypeDefinition)
|
||||
declaringType = declaringType.GetGenericTypeDefinition ();
|
||||
|
||||
// Get generic definition
|
||||
var bindingflags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
|
||||
const BindingFlags bindingflags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
|
||||
foreach (var m in declaringType.GetMethods (bindingflags)) {
|
||||
if (m.MetadataToken == mi.MetadataToken) {
|
||||
mi = m;
|
||||
@@ -253,7 +254,7 @@ namespace System.Diagnostics {
|
||||
sb.Append ("]");
|
||||
}
|
||||
|
||||
ParameterInfo[] p = mi.GetParametersInternal ();
|
||||
ParameterInfo[] p = mi.GetParameters ();
|
||||
|
||||
sb.Append (" (");
|
||||
for (int i = 0; i < p.Length; ++i) {
|
||||
@@ -264,18 +265,15 @@ namespace System.Diagnostics {
|
||||
if (pt.IsGenericType && ! pt.IsGenericTypeDefinition)
|
||||
pt = pt.GetGenericTypeDefinition ();
|
||||
|
||||
if (pt.IsClass && !String.IsNullOrEmpty (pt.Namespace)) {
|
||||
sb.Append (pt.Namespace);
|
||||
sb.Append (".");
|
||||
}
|
||||
sb.Append (pt.Name);
|
||||
sb.Append (pt.ToString());
|
||||
|
||||
if (p [i].Name != null) {
|
||||
sb.Append (" ");
|
||||
sb.Append (p [i].Name);
|
||||
}
|
||||
}
|
||||
sb.Append (")");
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString ()
|
||||
{
|
||||
@@ -289,6 +287,8 @@ 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,13 +296,78 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user