Debug.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. // Do not remove this, it is needed to retain calls to these conditional methods in release builds
  5. #define DEBUG
  6. using System.Threading;
  7. namespace System.Diagnostics
  8. {
  9. /// <summary>
  10. /// Provides a set of properties and methods for debugging code.
  11. /// </summary>
  12. public static partial class Debug
  13. {
  14. private static volatile DebugProvider s_provider = new DebugProvider();
  15. public static DebugProvider SetProvider(DebugProvider provider)
  16. {
  17. if (provider == null)
  18. throw new ArgumentNullException(nameof(provider));
  19. return Interlocked.Exchange(ref s_provider, provider);
  20. }
  21. public static bool AutoFlush { get { return true; } set { } }
  22. [ThreadStatic]
  23. private static int t_indentLevel;
  24. public static int IndentLevel
  25. {
  26. get
  27. {
  28. return t_indentLevel;
  29. }
  30. set
  31. {
  32. t_indentLevel = value < 0 ? 0 : value;
  33. s_provider.OnIndentLevelChanged(t_indentLevel);
  34. }
  35. }
  36. private static volatile int s_indentSize = 4;
  37. public static int IndentSize
  38. {
  39. get
  40. {
  41. return s_indentSize;
  42. }
  43. set
  44. {
  45. s_indentSize = value < 0 ? 0 : value;
  46. s_provider.OnIndentSizeChanged(s_indentSize);
  47. }
  48. }
  49. [System.Diagnostics.Conditional("DEBUG")]
  50. public static void Close() { }
  51. [System.Diagnostics.Conditional("DEBUG")]
  52. public static void Flush() { }
  53. [System.Diagnostics.Conditional("DEBUG")]
  54. public static void Indent()
  55. {
  56. IndentLevel++;
  57. }
  58. [System.Diagnostics.Conditional("DEBUG")]
  59. public static void Unindent()
  60. {
  61. IndentLevel--;
  62. }
  63. [System.Diagnostics.Conditional("DEBUG")]
  64. public static void Print(string message)
  65. {
  66. Write(message);
  67. }
  68. [System.Diagnostics.Conditional("DEBUG")]
  69. public static void Print(string format, params object[] args)
  70. {
  71. Write(string.Format(null, format, args));
  72. }
  73. [System.Diagnostics.Conditional("DEBUG")]
  74. public static void Assert(bool condition)
  75. {
  76. Assert(condition, string.Empty, string.Empty);
  77. }
  78. [System.Diagnostics.Conditional("DEBUG")]
  79. public static void Assert(bool condition, string message)
  80. {
  81. Assert(condition, message, string.Empty);
  82. }
  83. [System.Diagnostics.Conditional("DEBUG")]
  84. public static void Assert(bool condition, string message, string detailMessage)
  85. {
  86. if (!condition)
  87. {
  88. Fail(message, detailMessage);
  89. }
  90. }
  91. internal static void ContractFailure(string message, string detailMessage, string failureKindMessage)
  92. {
  93. string stackTrace;
  94. try
  95. {
  96. stackTrace = new StackTrace(2, true).ToString(System.Diagnostics.StackTrace.TraceFormat.Normal);
  97. }
  98. catch
  99. {
  100. stackTrace = "";
  101. }
  102. s_provider.WriteAssert(stackTrace, message, detailMessage);
  103. DebugProvider.FailCore(stackTrace, message, detailMessage, failureKindMessage);
  104. }
  105. [System.Diagnostics.Conditional("DEBUG")]
  106. public static void Fail(string message)
  107. {
  108. Fail(message, string.Empty);
  109. }
  110. [System.Diagnostics.Conditional("DEBUG")]
  111. public static void Fail(string message, string detailMessage)
  112. {
  113. s_provider.Fail(message, detailMessage);
  114. }
  115. [System.Diagnostics.Conditional("DEBUG")]
  116. public static void Assert(bool condition, string message, string detailMessageFormat, params object[] args)
  117. {
  118. Assert(condition, message, string.Format(detailMessageFormat, args));
  119. }
  120. [System.Diagnostics.Conditional("DEBUG")]
  121. public static void WriteLine(string message)
  122. {
  123. s_provider.WriteLine(message);
  124. }
  125. [System.Diagnostics.Conditional("DEBUG")]
  126. public static void Write(string message)
  127. {
  128. s_provider.Write(message);
  129. }
  130. [System.Diagnostics.Conditional("DEBUG")]
  131. public static void WriteLine(object value)
  132. {
  133. WriteLine(value?.ToString());
  134. }
  135. [System.Diagnostics.Conditional("DEBUG")]
  136. public static void WriteLine(object value, string category)
  137. {
  138. WriteLine(value?.ToString(), category);
  139. }
  140. [System.Diagnostics.Conditional("DEBUG")]
  141. public static void WriteLine(string format, params object[] args)
  142. {
  143. WriteLine(string.Format(null, format, args));
  144. }
  145. [System.Diagnostics.Conditional("DEBUG")]
  146. public static void WriteLine(string message, string category)
  147. {
  148. if (category == null)
  149. {
  150. WriteLine(message);
  151. }
  152. else
  153. {
  154. WriteLine(category + ": " + message);
  155. }
  156. }
  157. [System.Diagnostics.Conditional("DEBUG")]
  158. public static void Write(object value)
  159. {
  160. Write(value?.ToString());
  161. }
  162. [System.Diagnostics.Conditional("DEBUG")]
  163. public static void Write(string message, string category)
  164. {
  165. if (category == null)
  166. {
  167. Write(message);
  168. }
  169. else
  170. {
  171. Write(category + ": " + message);
  172. }
  173. }
  174. [System.Diagnostics.Conditional("DEBUG")]
  175. public static void Write(object value, string category)
  176. {
  177. Write(value?.ToString(), category);
  178. }
  179. [System.Diagnostics.Conditional("DEBUG")]
  180. public static void WriteIf(bool condition, string message)
  181. {
  182. if (condition)
  183. {
  184. Write(message);
  185. }
  186. }
  187. [System.Diagnostics.Conditional("DEBUG")]
  188. public static void WriteIf(bool condition, object value)
  189. {
  190. if (condition)
  191. {
  192. Write(value);
  193. }
  194. }
  195. [System.Diagnostics.Conditional("DEBUG")]
  196. public static void WriteIf(bool condition, string message, string category)
  197. {
  198. if (condition)
  199. {
  200. Write(message, category);
  201. }
  202. }
  203. [System.Diagnostics.Conditional("DEBUG")]
  204. public static void WriteIf(bool condition, object value, string category)
  205. {
  206. if (condition)
  207. {
  208. Write(value, category);
  209. }
  210. }
  211. [System.Diagnostics.Conditional("DEBUG")]
  212. public static void WriteLineIf(bool condition, object value)
  213. {
  214. if (condition)
  215. {
  216. WriteLine(value);
  217. }
  218. }
  219. [System.Diagnostics.Conditional("DEBUG")]
  220. public static void WriteLineIf(bool condition, object value, string category)
  221. {
  222. if (condition)
  223. {
  224. WriteLine(value, category);
  225. }
  226. }
  227. [System.Diagnostics.Conditional("DEBUG")]
  228. public static void WriteLineIf(bool condition, string message)
  229. {
  230. if (condition)
  231. {
  232. WriteLine(message);
  233. }
  234. }
  235. [System.Diagnostics.Conditional("DEBUG")]
  236. public static void WriteLineIf(bool condition, string message, string category)
  237. {
  238. if (condition)
  239. {
  240. WriteLine(message, category);
  241. }
  242. }
  243. }
  244. }