218

有没有办法对变量进行监视,并且只有在该值更改时才让 Visual Studio 中断?

这将使查找棘手的状态问题变得更加容易。

这可以做到吗?

断点条件仍然需要设置断点,我宁愿设置一个手表,让 Visual Studio 在状态更改时设置断点。

4

13 回答 13

142

在 Visual Studio 2005 菜单中:

调试->新断点->新数据断点

进入:

&myVariable
于 2008-10-01T22:36:30.443 回答
30

您还可以选择在代码中显式中断:

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

来自 MSDN:

Debugger.Break:如果没有附加调试器,则询问用户是否要附加调试器。如果是,则启动调试器。如果附加了调试器,调试器会收到用户断点事件的信号,并且调试器会暂停进程的执行,就像遇到了调试器断点一样。

不过,这只是一个后备方案。如其他评论中所述,在 Visual Studio 中设置条件断点是更好的选择。

于 2008-10-01T22:45:30.017 回答
28

Visual Studio 2015set中,您可以在自动实现的属性的访问器上放置断点,当属性更新时调试器将中断

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

更新

或者; @AbdulRaufMujahid 在评论中指出,如果自动实现的属性在单行上,您可以将光标定位在get;orset;并点击F9,相应地会放置一个断点。好的!

public bool IsUpdated { get; set; }
于 2016-06-16T21:31:47.253 回答
13

想象一下,您有一个名为 A 的类,其声明如下。

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

您希望程序在有人修改“m_value”的值时停止。

转到类定义并在 A 的构造函数中放置一个断点。

A::A()
{
    ... // set breakpoint here
}

一旦我们停止程序:

调试 -> 新断点 -> 新数据断点 ...

地址:&(this->m_value)
字节数:4(因为 int 有 4 个字节)

现在,我们可以恢复程序了。当值更改时,调试器将停止。

您可以对继承的类或复合类执行相同的操作。

class B
{
   private:
       A m_a;
};

地址:&(this->m_a.m_value)

如果您不知道要检查的变量的字节数,可以使用 sizeof 运算符。

例如:

// to know the size of the word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

如果您查看“调用堆栈”,您可以看到更改变量值的函数。

于 2011-03-05T20:50:44.400 回答
10

将变量更改为属性,并在 set 方法中添加断点。例子:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}
于 2013-09-04T14:35:40.367 回答
4

如果您使用 WPF,有一个很棒的工具:WPF Inspector
它将自身附加到 WPF 应用程序并显示具有所有属性的完整控件树,它允许您(除其他外)在任何属性更改时中断。

但遗憾的是,我没有找到任何工具可以让你对任何属性或变量做同样的事情。

于 2011-11-17T17:14:53.720 回答
4

2019年更新:

现在,适用于 .Net Core 3.0 或更高版本的 Visual Studio 2019 Preview 2 正式支持此功能。当然,您可能需要考虑使用预览版 IDE 的潜在风险。我想在不久的将来这将包含在官方的 Visual Studio 中。

https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

幸运的是,数据断点不再是 C++ 独有的,因为它们现在可用于 Visual Studio 2019 Preview 2 中的 .NET Core(3.0 或更高版本)!

于 2019-02-12T19:21:07.060 回答
3

我记得您使用Visual Basic 6.0描述它的方式。在 Visual Studio 中,到目前为止我发现的唯一方法是指定断点条件

于 2008-10-01T22:28:18.077 回答
2

右键单击断点对我来说效果很好(尽管大多数情况下我将它用于特定变量值的条件断点。即使在涉及线程名称的表达式上中断也可以,如果您试图发现线程问题,这非常有用)。

于 2008-10-01T22:28:15.313 回答
2

正如彼得莫滕森所写:

在 Visual Studio 2005 菜单中:

调试 -> 新断点 -> 新数据断点

输入:&myVariable

附加信息:

显然,系统必须知道要监视内存中的哪个地址。myVariable所以 - 为(或)的初始化设置一个正常的断点myClass.m_Variable- 运行系统并等待它在该断点处停止。- 现在菜单项已启用,您可以通过输入来观察变量&myVariable,或者通过输入来观察实例&myClass.m_Variable。现在地址已经很好地定义了。

抱歉,当我通过解释已经给出的解决方案做错事时。但我无法添加评论,并且对此有一些评论。

于 2019-01-14T11:06:16.757 回答
1

您可以在非托管代码中使用内存观察点。不确定这些是否在托管代码中可用。

于 2008-10-01T22:38:20.640 回答
1

您可能可以巧妙地使用DebugBreak()函数。

于 2011-05-18T06:52:40.657 回答
1

您可以选择为变量重载 = 运算符,并可以在特定条件下将断点放在重载函数中。

于 2015-12-01T12:39:58.220 回答