如何防止调试器在暂停时调用某些源代码?

时间:2015-09-14 22:21:05

标签: c# visual-studio-debugging

在visual studio中,当应用程序在调试模式下停止时,您可以将鼠标悬停在对象/属性上以查看其中的内容。

enter image description here

当您使用调试器打开对象时,就像我在上面的图片中所做的那样,该属性将调用Get方法作为调试器检索属性值以显示用户的方式。

class Program
{
        static void Main(string[] args)
    {
        Foo foo = new Foo();

        foo.MyLock.EnterWriteLock();
        foo.Bar = 5.1;
        foo.MyLock.ExitWriteLock();

        // "I stop here and attempt to see what the value of Bar is via the debugger."
        foo.MyLock.EnterReadLock();
        Console.WriteLine(foo.Bar);
        foo.MyLock.ExitReadLock();
    }
}

class Foo
{
    private double bar;
    public double Bar 
    {
        get
        {
            Console.WriteLine(MyLock.IsReadLockHeld);
            Debug.Assert(MyLock.IsReadLockHeld, "Please enter the read lock before attempting to read this property.");
            return bar;
        }
        set
        {
            Debug.Assert(MyLock.IsWriteLockHeld, "Please enter the write lock before attempting to write this property.");
            bar = value;
        }
    }

    public ReaderWriterLockSlim MyLock { get; set; }

    public Foo()
    {
        MyLock = new ReaderWriterLockSlim();
    }
}

在我的应用程序中,我将Debug.Assert()调用添加到我的Get访问器中,以确保此示例中的Foo已被锁定。每当我的代码调用Bar时,foo应该按照设计被锁定,但是当调试器试图查看bar时,foo将不会被锁定,这意味着断言应该失败。

当调试器遇到失败的断言时,它有时会抑制断言弹出窗口,有时它会根据正常失败的断言行为显示断言弹出窗口。尽管我可以告诉Assert弹出窗口似乎被抑制了前1-2次调试器查看Bar的值但是每次在前1-2之后弹出窗口都被允许显示。虽然这是断言抑制的最常见行为,但情况并非总是如此,因为在应用程序的其他运行中,无论调试器查看Bar多少次,调试器都不会停止抑制。

问题:对于我的应用程序,所需的行为是100%的时间抑制断言。我该如何实现这一目标?

修改 此外,如果它在调试器遇到其中一个断言时有帮助,并且它失败了以下消息,它就会写入Debug输出。无论断言是否被抑制,这都是完全相同的消息。

---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
Please enter the read lock before attempting to read this property.
---- Assert Long Message ----

   at TestApp_Debugging.Foo.get_Bar() in c:\Users\Adrian.vanBerkhout\Documents\Visual Studio 2013\Projects\TestApp_Debugging\TestApp_Debugging\Program.cs:line 37
   at TestApp_Debugging.Program.Main(String[] args) in c:\Users\Adrian.vanBerkhout\Documents\Visual Studio 2013\Projects\TestApp_Debugging\TestApp_Debugging\Program.cs:line 17
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

1 个答案:

答案 0 :(得分:3)

我找到了解决方案here。使用DebuggerBrowsable属性装饰您的问题属性。

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

理想情况下,您永远不需要这样做。但是,我们有一些属性在评估时(在调试中)触发代码契约异常,这会导致Visual Studio变得非常混乱。您可能需要修饰类及其实现的任何接口上的属性。