c# - 如何从代码中检测 Visual Studio 调试执行上下文?

标签 c# visual-studio

我正在寻找一种方法来检测代码在 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/

相关文章:

c# - 对于 64 位应用程序,.NET 使用 WSAStartup 是否安全?

c# - 删除一个 altChunk

visual-studio - Visual Studio Profiler 将 "[broken]"显示为函数名称

visual-studio - Visual Studio 之外的 TFS 客户端选项?

c++ - Qt 和英特尔实感入门

c# - HttpClient 内存使用量激增且响应较大

c# - 保存/检索图像。 ASP.NET MVC

c++ - 运行调试器 Visual Studio 时 argv 中的 PATH

c# - 为什么突然一个线程运行一个方法的一部分?

c++ - 运算符重载解决方案