我正在寻找一种方法来检测代码在 Visual Studio 调试 session 期间的调用方式。试图区分这两种情况:
- 普通调试,无论是运行还是单步执行。
- 通过调试器本身调用,例如从监 window 口调用我的 ToString。
(我这样做是因为我有一些非发布线程验证代码,我想在第二种情况下禁用它。)
有没有人有办法做到这一点,或者对追求的事情有想法?我对 hacky、tricky 方法很好,即使它们特定于特定版本的 VS。
不起作用的东西:
- 抓取 StackTrace 并寻找一些神奇的东西,这意味着调试器正在调用,而不是常规代码。VS 使用处于当前状态的当前线程调用 Watch 窗口,所以StackTrace 将看到的只是调试器断点处的当前堆栈 + Watch 窗口正在调用的 getter/ToString,就在它的顶部。
最佳答案
当 Visual Studio 假设的方法是纯方法(即求值对程序状态没有影响)具有副作用或具有调试器违反的先决条件时,通常会出现这种情况。
最好使用以下工具解决这些情况:
DebuggerBrowsableAttribute :将此属性应用于属性:
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
- 适用于
get
的所有属性方法不是纯粹的,即 getter 通过设置缓存值或其他方式改变程序的状态 - 适用于
get
的所有属性方法具有调试器可能违反的先决条件,例如线程限制、跨线程调用(如果使用 COM 互操作,请不要忘记隐式)
- 适用于
DebuggerDisplayAttribute : 将此属性应用于所有
ToString()
的类型实现执行重要的操作(避免调试器性能影响)或具有调试器可能不满足的先决条件(例如线程要求)。此属性用于而不是调用ToString()
对于这些类型。DebuggerTypeProxyAttribute :将此属性应用于需要特别考虑信息在调试器中显示的时间、内容和方式的类型。 .NET 框架本身广泛使用此属性来提供功能,例如
List<T>
的清晰输出。和HashMap<T>
类型,甚至改进可用于Lazy<T>
等类型的信息有时可以评估,有时可能会影响程序的状态。
关于c# - 如何从代码中检测 Visual Studio 调试执行上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258244/