1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Text;
- namespace VCommon.Diagnostics
- {
- public static class StackTraceExtensionMethod
- {
- /// <summary> 将堆栈跟踪信息格式化成每一帧都带程序集的详情文本, 可指定一个type来忽略之上的调用堆栈帧 </summary>
- public static string GetFormattedDetailStackTraceText(this StackTrace me, Type skipUpper = null)
- {
- var frames = me.GetFrames();
- if (null == frames) return null;
- if (null != skipUpper)
- {
- var lst = new List<StackFrame>(frames.Length);
- for (var i = frames.Length - 1; i >= 0; i--)
- {
- if (frames[i].GetMethod().DeclaringType == skipUpper) break;
- lst.Insert(0, frames[i]);
- }
- frames = lst.ToArray();
- }
- var sb = new StringBuilder();
- foreach (var frame in frames)
- {
- var method = frame.GetMethod();
- var type = method.DeclaringType;
- var exeasm = type?.Assembly;
- var filename = frame.GetFileName();
- if (null != exeasm) sb.Append($"[{exeasm.GetName().Name}] ");
- if (null != type) sb.Append($"{type.FullName}::");
- sb.Append($"{method}");
- if (null != filename) sb.Append($" @ {filename}:{frame.GetFileLineNumber()},{frame.GetFileColumnNumber()}");
- sb.AppendLine();
- }
- return sb.ToString();
- }
- }
- }
|