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();