diff --git a/src/System.Private.CoreLib/shared/System/Diagnostics/Debug.cs b/src/System.Private.CoreLib/shared/System/Diagnostics/Debug.cs index cd22c8174627..6eef1c8aeeb9 100644 --- a/src/System.Private.CoreLib/shared/System/Diagnostics/Debug.cs +++ b/src/System.Private.CoreLib/shared/System/Diagnostics/Debug.cs @@ -101,17 +101,7 @@ public static void Assert(bool condition, string message, string detailMessage) { if (!condition) { - string stackTrace; - try - { - stackTrace = new StackTrace(0, true).ToString(System.Diagnostics.StackTrace.TraceFormat.Normal); - } - catch - { - stackTrace = ""; - } - WriteAssert(stackTrace, message, detailMessage); - s_provider.ShowDialog(stackTrace, message, detailMessage, "Assertion Failed"); + Fail(message, detailMessage); } } @@ -128,31 +118,21 @@ internal static void ContractFailure(bool condition, string message, string deta { stackTrace = ""; } - WriteAssert(stackTrace, message, detailMessage); - s_provider.ShowDialog(stackTrace, message, detailMessage, SR.GetResourceString(failureKindMessage)); + s_provider.WriteAssert(stackTrace, message, detailMessage); + DebugProvider.FailCore(stackTrace, message, detailMessage, SR.GetResourceString(failureKindMessage)); } } [System.Diagnostics.Conditional("DEBUG")] public static void Fail(string message) { - Assert(false, message, string.Empty); + Fail(message, string.Empty); } [System.Diagnostics.Conditional("DEBUG")] public static void Fail(string message, string detailMessage) { - Assert(false, message, detailMessage); - } - - private static void WriteAssert(string stackTrace, string message, string detailMessage) - { - WriteLine(SR.DebugAssertBanner + Environment.NewLine - + SR.DebugAssertShortMessage + Environment.NewLine - + message + Environment.NewLine - + SR.DebugAssertLongMessage + Environment.NewLine - + detailMessage + Environment.NewLine - + stackTrace); + s_provider.Fail(message, detailMessage); } [System.Diagnostics.Conditional("DEBUG")] diff --git a/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.Unix.cs b/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.Unix.cs index 481f309e2884..e1517179ec17 100644 --- a/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.Unix.cs +++ b/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.Unix.cs @@ -10,8 +10,14 @@ public partial class DebugProvider { private static readonly bool s_shouldWriteToStdErr = Environment.GetEnvironmentVariable("COMPlus_DebugWriteToStdErr") == "1"; - public virtual void ShowDialog(string stackTrace, string message, string detailMessage, string errorSource) + public static void FailCore(string stackTrace, string message, string detailMessage, string errorSource) { + if (s_FailCore != null) + { + s_FailCore(stackTrace, message, detailMessage, errorSource); + return; + } + if (Debugger.IsAttached) { Debugger.Break(); diff --git a/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.cs b/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.cs index 3150e68ed53a..686fc18db3e2 100644 --- a/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.cs +++ b/src/System.Private.CoreLib/shared/System/Diagnostics/DebugProvider.cs @@ -8,10 +8,35 @@ namespace System.Diagnostics { /// - /// Provides default implementation for Write and ShowDialog methods in Debug class. + /// Provides default implementation for Write and Fail methods in Debug class. /// public partial class DebugProvider { + public virtual void Fail(string message, string detailMessage) + { + string stackTrace; + try + { + stackTrace = new StackTrace(0, true).ToString(System.Diagnostics.StackTrace.TraceFormat.Normal); + } + catch + { + stackTrace = ""; + } + WriteAssert(stackTrace, message, detailMessage); + FailCore(stackTrace, message, detailMessage, "Assertion Failed"); + } + + internal void WriteAssert(string stackTrace, string message, string detailMessage) + { + WriteLine(SR.DebugAssertBanner + Environment.NewLine + + SR.DebugAssertShortMessage + Environment.NewLine + + message + Environment.NewLine + + SR.DebugAssertLongMessage + Environment.NewLine + + detailMessage + Environment.NewLine + + stackTrace); + } + public virtual void Write(string message) { lock (s_lock) @@ -78,6 +103,7 @@ private string GetIndentString() } // internal and not readonly so that the tests can swap this out. + internal static Action s_FailCore = null; internal static Action s_WriteCore = null; } -} \ No newline at end of file +} diff --git a/src/System.Private.CoreLib/src/System/Diagnostics/DebugProvider.Windows.cs b/src/System.Private.CoreLib/src/System/Diagnostics/DebugProvider.Windows.cs index 88f6116f15b1..1eb445df1781 100644 --- a/src/System.Private.CoreLib/src/System/Diagnostics/DebugProvider.Windows.cs +++ b/src/System.Private.CoreLib/src/System/Diagnostics/DebugProvider.Windows.cs @@ -6,8 +6,14 @@ namespace System.Diagnostics { public partial class DebugProvider { - public virtual void ShowDialog(string stackTrace, string message, string detailMessage, string errorSource) + public static void FailCore(string stackTrace, string message, string detailMessage, string errorSource) { + if (s_FailCore != null) + { + s_FailCore(stackTrace, message, detailMessage, errorSource); + return; + } + if (Debugger.IsAttached) { Debugger.Break();