Debug.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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(bool condition, string message, string detailMessage, string failureKindMessage)
  92. {
  93. if (!condition)
  94. {
  95. string stackTrace;
  96. try
  97. {
  98. stackTrace = new StackTrace(2, true).ToString(System.Diagnostics.StackTrace.TraceFormat.Normal);
  99. }
  100. catch
  101. {
  102. stackTrace = "";
  103. }
  104. s_provider.WriteAssert(stackTrace, message, detailMessage);
  105. DebugProvider.FailCore(stackTrace, message, detailMessage, SR.GetResourceString(failureKindMessage));
  106. }
  107. }
  108. [System.Diagnostics.Conditional("DEBUG")]
  109. public static void Fail(string message)
  110. {
  111. Fail(message, string.Empty);
  112. }
  113. [System.Diagnostics.Conditional("DEBUG")]
  114. public static void Fail(string message, string detailMessage)
  115. {
  116. s_provider.Fail(message, detailMessage);
  117. }
  118. [System.Diagnostics.Conditional("DEBUG")]
  119. public static void Assert(bool condition, string message, string detailMessageFormat, params object[] args)
  120. {
  121. Assert(condition, message, string.Format(detailMessageFormat, args));
  122. }
  123. [System.Diagnostics.Conditional("DEBUG")]
  124. public static void WriteLine(string message)
  125. {
  126. s_provider.WriteLine(message);
  127. }
  128. [System.Diagnostics.Conditional("DEBUG")]
  129. public static void Write(string message)
  130. {
  131. s_provider.Write(message);
  132. }
  133. [System.Diagnostics.Conditional("DEBUG")]
  134. public static void WriteLine(object value)
  135. {
  136. WriteLine(value?.ToString());
  137. }
  138. [System.Diagnostics.Conditional("DEBUG")]
  139. public static void WriteLine(object value, string category)
  140. {
  141. WriteLine(value?.ToString(), category);
  142. }
  143. [System.Diagnostics.Conditional("DEBUG")]
  144. public static void WriteLine(string format, params object[] args)
  145. {
  146. WriteLine(string.Format(null, format, args));
  147. }
  148. [System.Diagnostics.Conditional("DEBUG")]
  149. public static void WriteLine(string message, string category)
  150. {
  151. if (category == null)
  152. {
  153. WriteLine(message);
  154. }
  155. else
  156. {
  157. WriteLine(category + ": " + message);
  158. }
  159. }
  160. [System.Diagnostics.Conditional("DEBUG")]
  161. public static void Write(object value)
  162. {
  163. Write(value?.ToString());
  164. }
  165. [System.Diagnostics.Conditional("DEBUG")]
  166. public static void Write(string message, string category)
  167. {
  168. if (category == null)
  169. {
  170. Write(message);
  171. }
  172. else
  173. {
  174. Write(category + ": " + message);
  175. }
  176. }
  177. [System.Diagnostics.Conditional("DEBUG")]
  178. public static void Write(object value, string category)
  179. {
  180. Write(value?.ToString(), category);
  181. }
  182. [System.Diagnostics.Conditional("DEBUG")]
  183. public static void WriteIf(bool condition, string message)
  184. {
  185. if (condition)
  186. {
  187. Write(message);
  188. }
  189. }
  190. [System.Diagnostics.Conditional("DEBUG")]
  191. public static void WriteIf(bool condition, object value)
  192. {
  193. if (condition)
  194. {
  195. Write(value);
  196. }
  197. }
  198. [System.Diagnostics.Conditional("DEBUG")]
  199. public static void WriteIf(bool condition, string message, string category)
  200. {
  201. if (condition)
  202. {
  203. Write(message, category);
  204. }
  205. }
  206. [System.Diagnostics.Conditional("DEBUG")]
  207. public static void WriteIf(bool condition, object value, string category)
  208. {
  209. if (condition)
  210. {
  211. Write(value, category);
  212. }
  213. }
  214. [System.Diagnostics.Conditional("DEBUG")]
  215. public static void WriteLineIf(bool condition, object value)
  216. {
  217. if (condition)
  218. {
  219. WriteLine(value);
  220. }
  221. }
  222. [System.Diagnostics.Conditional("DEBUG")]
  223. public static void WriteLineIf(bool condition, object value, string category)
  224. {
  225. if (condition)
  226. {
  227. WriteLine(value, category);
  228. }
  229. }
  230. [System.Diagnostics.Conditional("DEBUG")]
  231. public static void WriteLineIf(bool condition, string message)
  232. {
  233. if (condition)
  234. {
  235. WriteLine(message);
  236. }
  237. }
  238. [System.Diagnostics.Conditional("DEBUG")]
  239. public static void WriteLineIf(bool condition, string message, string category)
  240. {
  241. if (condition)
  242. {
  243. WriteLine(message, category);
  244. }
  245. }
  246. }
  247. }