【问题标题】:.NET: Attribute to force debugger to step into a property.NET:强制调试器进入属性的属性
【发布时间】:2014-02-11 21:27:04
【问题描述】:

Visual Studio 有一个名为“跳过属性和运算符(仅限托管)”的调试设置。这个设置很有用,我一般都开启了。

现在,每隔一段时间,项目中就会有一个属性设置器/获取器,这相当复杂,在调试时我希望能够进入它。有没有办法用一个属性来装饰这个属性,以便调试器忽略该属性的上述设置并允许我进入它?

基本上,它应该与DebuggerStepThroughAttribute相反。

或者还有其他方法可以实现吗?我目前所做的是在单步执行之前在属性 getter/setter 中设置一个断点,但这不是很方便,因为它需要我在每次单步执行特定代码片段时添加/删除断点。

编辑:cmets 建议重构。不过,这并不能真正回答我的问题,在我的情况下也没有必要。我所说的“参与”并不是指大量代码或一些资源密集型代码。在我的例子中,属性设置器触发对象内部的计算(O(1) 复杂度,大约两毫秒)。但是,该计算并不那么明显,并且每隔一段时间我想通过按下 step into 键来进入属性设置器。

【问题讨论】:

  • 属性如何比设置断点更灵活?
  • 在我不想进入该属性的情况下会遇到断点。这就是为什么我必须在属性访问之前插入它并在之后删除它。
  • 但是断点可以是有条件的,而属性是编译的?
  • 好吧,如果你认为我的要求可以通过条件断点来满足,欢迎你回答问题。
  • RE:DataBinding,如果您在用于数据绑定的属性中做了大量工作,那么您的 UI 将无法响应。您的视图模型应该非常简单,并且应该由可能从 UI 异步运行的其他代码填充。

标签: c# .net visual-studio debugging


【解决方案1】:

好吧,要做到这一点,您需要一种方法来了解调试器是处于运行模式还是单步执行模式。遗憾的是,您无法在应用程序中获得这些信息。

所以,我写了一个简单的宏:

dte.Debugger.ExecuteStatement('AppDomain.CurrentDomain.SetData("Stepping", "True")');
dte.Debugger.StepOver();
dte.Debugger.ExecuteStatement('AppDomain.CurrentDomain.SetData("Stepping", null)');

您必须安装宏加载项 - 这是 Microsoft 提供的,所以不用担心。

这允许您使用简单的条件断点:

AppDomain.CurrentDomain.GetData("Stepping") != null

(如果你愿意,也可以很容易地使用宏来创建断点)

现在,无需使用通常的 Step Over 命令,您只需运行宏,它会在给定条件的每个断点处自动中断:)

应该可以将快捷方式(和菜单命令)附加到宏,但由于某种原因,这对我不起作用。如果这对你来说是个问题,你总是可以制作一个 VSPackage(现在它很简单,但你必须安装 Visual Studio SDK),并使用几乎相同的代码,除了用 C# 而不是 JavaScript :)

请注意,这假设您使用的是 VS2012+ - 在早期版本中,您可以以相同的方式简单地使用内置宏。当然,这意味着将代码翻译成 VB,但是...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 2010-10-08
    • 2010-12-31
    • 1970-01-01
    • 2011-12-16
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多