gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:06:13 29 4
gpt4 key购买 nike

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

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 弹出窗口在调试器查看 Bar 值的前 1-2 次似乎被抑制,但每次在前 1-2 次之后,弹出窗口都被允许显示。虽然这是抑制断言的最常见行为,但情况并非总是如此,因为在应用程序的其他运行中,无论调试器查看 Bar 多少次,调试器都不会停止抑制。

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

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

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

最佳答案

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

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

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

关于c# - 如何防止调试器在暂停时调用某些源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574840/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com