繁体   English   中英

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

[英]How to detect Visual Studio debug execution context from within code?

我正在寻找一种方法来检测在Visual Studio中的调试会话期间如何调用代码。 试图区分这两种情况:

  • 普通调试,无论是运行还是单步执行。
  • 通过调试器本身调用,例如从监视窗口调用我的ToString。

(我这样做是因为我想要在第二种情况下禁用一些非发布线程验证代码。)

任何人都有办法做到这一点,或者有关于追求事物的想法? 我对hacky,tricksy方法很好,即使它们特定于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>等类型的可用信息,这些类型有时可以评估,有时也可以可能会影响该计划的状态。

就普通调试而言,我认为这就是你想要的:

System.Diagnostics.Debugger.IsAttached

这是文档

但这对观察窗无效。 在这方面,也许StackTrace类可以帮助,但我自己没有尝试过。 它位于相同的命名空间中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM