StackTraceExtensionMethod.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Text;
  5. namespace VCommon.Diagnostics
  6. {
  7. public static class StackTraceExtensionMethod
  8. {
  9. /// <summary> 将堆栈跟踪信息格式化成每一帧都带程序集的详情文本, 可指定一个type来忽略之上的调用堆栈帧 </summary>
  10. public static string GetFormattedDetailStackTraceText(this StackTrace me, Type skipUpper = null)
  11. {
  12. var frames = me.GetFrames();
  13. if (null == frames) return null;
  14. if (null != skipUpper)
  15. {
  16. var lst = new List<StackFrame>(frames.Length);
  17. for (var i = frames.Length - 1; i >= 0; i--)
  18. {
  19. if (frames[i].GetMethod().DeclaringType == skipUpper) break;
  20. lst.Insert(0, frames[i]);
  21. }
  22. frames = lst.ToArray();
  23. }
  24. var sb = new StringBuilder();
  25. foreach (var frame in frames)
  26. {
  27. var method = frame.GetMethod();
  28. var type = method.DeclaringType;
  29. var exeasm = type?.Assembly;
  30. var filename = frame.GetFileName();
  31. if (null != exeasm) sb.Append($"[{exeasm.GetName().Name}] ");
  32. if (null != type) sb.Append($"{type.FullName}::");
  33. sb.Append($"{method}");
  34. if (null != filename) sb.Append($" @ {filename}:{frame.GetFileLineNumber()},{frame.GetFileColumnNumber()}");
  35. sb.AppendLine();
  36. }
  37. return sb.ToString();
  38. }
  39. }
  40. }