Debug.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Reflection;
  5. using System.Runtime.CompilerServices;
  6. using System.Text;
  7. namespace BansheeEngine
  8. {
  9. public sealed class Debug
  10. {
  11. public static void Log(object message)
  12. {
  13. StringBuilder sb = new StringBuilder();
  14. sb.AppendLine(message.ToString());
  15. sb.Append(GetStackTrace());
  16. Internal_Log(sb.ToString());
  17. }
  18. public static void LogWarning(object message)
  19. {
  20. StringBuilder sb = new StringBuilder();
  21. sb.AppendLine(message.ToString());
  22. sb.Append(GetStackTrace());
  23. Internal_LogWarning(sb.ToString());
  24. }
  25. public static void LogError(object message)
  26. {
  27. StringBuilder sb = new StringBuilder();
  28. sb.AppendLine(message.ToString());
  29. sb.Append(GetStackTrace());
  30. Internal_LogError(sb.ToString());
  31. }
  32. public static string GetStackTrace()
  33. {
  34. StackTrace stackTrace = new StackTrace(1, true);
  35. StackFrame[] frames = stackTrace.GetFrames();
  36. if (frames == null)
  37. return "";
  38. StringBuilder sb = new StringBuilder();
  39. foreach (var frame in frames)
  40. {
  41. MethodBase method = frame.GetMethod();
  42. if (method == null)
  43. continue;
  44. Type parentType = method.DeclaringType;
  45. if (parentType == null)
  46. continue;
  47. sb.Append("\tat " + parentType.Name + "." + method.Name + "(");
  48. ParameterInfo[] methodParams = method.GetParameters();
  49. for(int i = 0; i < methodParams.Length; i++)
  50. {
  51. if (i > 0)
  52. sb.Append(", ");
  53. sb.Append(methodParams[i].ParameterType.Name);
  54. }
  55. sb.Append(")");
  56. string ns = parentType.Namespace;
  57. string fileName = frame.GetFileName();
  58. if (!string.IsNullOrEmpty(fileName))
  59. {
  60. int line = frame.GetFileLineNumber();
  61. int column = frame.GetFileColumnNumber();
  62. sb.Append(" in " + fileName + ", line " + line + ", column " + column + ", namespace " + ns);
  63. }
  64. else
  65. {
  66. if (!string.IsNullOrEmpty(ns))
  67. sb.Append(" in namespace " + ns);
  68. }
  69. sb.AppendLine();
  70. }
  71. return sb.ToString();
  72. }
  73. [MethodImpl(MethodImplOptions.InternalCall)]
  74. internal static extern Component Internal_Log(string message);
  75. [MethodImpl(MethodImplOptions.InternalCall)]
  76. internal static extern Component Internal_LogWarning(string message);
  77. [MethodImpl(MethodImplOptions.InternalCall)]
  78. internal static extern Component Internal_LogError(string message);
  79. }
  80. }