【问题标题】:Follow an object state in Visual Studio debug mode在 Visual Studio 调试模式下遵循对象状态
【发布时间】:2011-02-11 12:45:17
【问题描述】:

假设我有一个 WinForm,其中有一个 private int selectedObjectsCount

有没有办法在调试模式下通过调试会话“跟踪”这个对象状态?

或者,在其他情况下,我有一个 myFont 实例。我想看看它的属性IsBold在什么时候发生变化(被修改)

我需要一个跟踪,因为一个对象变得“价值不高”,我不明白发生了什么在哪里

在 VS 2010 中是否有类似的可能?

【问题讨论】:

    标签: .net visual-studio visual-studio-2010 debugging


    【解决方案1】:

    在任何合适的地方创建一个断点以查看对象何时更改,右键单击断点并选择“当命中...”在这里您可以在调试窗口中打印对象内容——有效地查看对象何时更改以及发生了什么变化。

    在任何断点处,您都会在“调用堆栈”调试窗口中获得完整的跟踪信息。

    调试的艺术是你应该重视和学习的东西(它会得到回报)。请参阅this page 以获得关于 VS 中调试替代方案的非常简单的概述。

    【讨论】:

    • 我需要一个跟踪,因为一个对象变得“价值不高”,我不明白 WHERE。
    • @seriho:默认情况下,"When Hit" Tracepoint nessage 将跟踪它是从哪个方法打印的。
    • @Omer Raviv:那么,如果我将 myPanel.Width 设置为百万个位置,您建议我设置百万个断点,这是您的想法吗?
    • 我并不是说这是一个好的解决方案,我只是说在 Visual Studio 中没有更好的解决方案:)
    • @Omer Raviv:设置一百万个断点甚至不是一个解决方案......比我们举个例子更重要的是,框架代码也可以修改 Width 属性(比如,当应用 Dock=Fill),所以我无法设置断点。
    【解决方案2】:

    在这种情况下,我将 selectedObjectsCount 实现为属性,并在 setter 中检查值的变化:

    set
    {
        if (M_selectedObjectsCount != value)
        {
            selectedObjectsCount = value;//break here
        }
    }
    

    【讨论】:

    • 对于第二种(字体)情况?这实际上是我的实际“问题”。跟随对象属性的修改
    • 没有理由停止调试以添加此检查 - 您可以添加具有该条件的条件断点(右键单击断点并选择“条件”)。
    • @Omer:没有人在谈论“停止调试”……问题在于属性的修改检测和跟踪。
    • 我只是评论说,如果“M_selectedObjectsCount != value”部分不是原始属性的一部分,您不需要将其添加到代码中,您可以将其添加为断点条件(不退出调试/运行模式)。
    【解决方案3】:

    您可以使用监视窗口。如果您在 VS 底部看不到它,您可以通过转到 Debug->Windows->Watch->Watch 1(或其他 Watch 窗口)将其打开。此菜单项仅在您调试时可用。

    您可以在其中添加对象、它们的属性甚至表达式,并在跟踪时观察它们的值。通过双击监视窗口中的最后一行并在名称列中输入您的表达式来添加项目。

    例如在表单中进行调试时,在名称中输入 Height,您会看到它的值。 您还可以执行 (Height + Width) / 2 之类的操作。

    但是,您不能在值更改时设置断点。但是在跟踪时,更改值的行将被突出显示。不幸的是,您必须单步执行代码,而不能只运行它。

    【讨论】:

    • 我需要一个跟踪,因为一个对象变得“价值不高”,我不明白 WHERE。
    • 我不是 VS 新手,所以,我知道 Watch 窗口,但是这个窗口在代码运行时无助于“跟踪”对象状态,而是在到达断点时。跨度>
    • 如果你知道变量变化的地方,你可以对对象值进行VS记录变化。为此,在值发生更改的所有位置设置断点,右键单击断点,单击When hit...。在弹出的窗口中,勾选Print a message,并输入你想要打印的消息(你可以在那里打印你想要的值),并勾选Continue execution。这样,每次执行该行时,都可以打印新值,但不会停止执行。 VS 没有“告诉我这个值何时何地改变”或“当它改变时中断”功能。
    • 如果你得到一个“坏值”的指针,那么你的对象可能已经被释放了。这通常发生在您拥有dangling pointer 时。如果您有 2 个指针,“p”和“q”,并且都指向同一个对象“o”。如果你调用“delete p; p = NULL”,你仍然有 'q' 指向一个不再存在的旧引用。调试或跟踪它在哪里被释放的一个好方法是在你的对象析构函数处设置一个断点,然后分析它的调用堆栈。
    【解决方案4】:

    您是 Visual Interdev/VB6 的前用户吗?

    我记得您可以将断点设置为“值更改时中断”。不幸的是,后续版本无法做到这一点。

    我认为@TheNIK 用属性替换的想法可能是你最好的选择。或者使用“查看所有参考资料”,然后按照@TeddHansen 的说法打印“当被击中时”。

    【讨论】:

    • 想象一下,我有一个面板突然改变了它的宽度。我需要跟踪发生这种情况的位置。
    • @serhio,覆盖/新建 Width 属性并打破它。
    【解决方案5】:

    正如其他人所说,.NET 中没有“数据断点”。如果您拥有要跟踪的变量,您可以做的最好的事情是在设置器中放置一个断点,然后右键单击断点,选择条件断点以检查值是否确实在变化。如果要跟踪的变量是字段,则必须将其转换为属性。

    如果您不拥有该属性的代码,您可以使用 Resharper 的 Value Origin 功能快速找到您的代码设置该属性的所有位置,并将断点放在那里:很多工作,但它完成工作。

    【讨论】:

    • 那么,对于 Font.Bold、Panel.Width、button.BackColor 等属性有没有解决方案?...
    【解决方案6】:

    在 Visual Studio 2010 中可以做到这一点。您需要使用的是“Debug/New Breakpoint/New Data Breakpoint...”菜单选项。

    但是,该选项仅适用于本机 C++ 项目。

    有关更多信息,请参阅此处 - http://msdn.microsoft.com/en-us/library/350dyxd0.aspx

    [编辑] - 对于其他语言和您的具体情况,您可以创建一个继承自 Font 类的新类并覆盖 IsBold 属性。将断点放在那里并使用这个新的自定义类而不是 Font。有点啰嗦,但应该可以。

    【讨论】:

      【解决方案7】:

      从技术上讲,C# 中没有“数据断点”,因为对象在垃圾收集压缩阶段在内存中移动。 但通常你可以用属性来做这个技巧 - 属性被编译成 setter 和 getter 方法,你可以像任何其他方法一样在它们上设置断点。

      我刚刚在这里回答了一个非常相似的问题:

      Reasking about hitting breakpoint at property setter

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多