使用Visual Studio调试器更改值时中断

时间:2008-10-01 22:26:51

标签: visual-studio debugging

有没有办法将监视放在变量上,只有在该值发生变化时Visual Studio才会中断?

这样可以更容易地找到棘手的状态问题。

可以这样做吗?

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

13 个答案:

答案 0 :(得分:118)

在Visual Studio 2005菜单中:

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

输入:

&myVariable

答案 1 :(得分:27)

您还可以选择在代码中明确断开:

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

来自MSDN:

  

Debugger.Break:   如果没有附加调试器,则用户是   问他们是否要附上一个   调试器。如果是,调试器是   开始。如果连接了调试器,   调试器与用户发出信号   断点事件和调试器   暂停执行该进程   就像调试器断点一样   击中。

但这只是一个后备。如其他注释中所述,在Visual Studio中设置条件断点是更好的选择。

答案 2 :(得分:26)

真的很老,但万一有人不知道......

Visual Studio 2015 中,您可以在自动实现的属性的Cells(1, 1) = input 访问器上放置断点,并且在更新属性时调试器将中断

set

<强>更新

可替换地; @AbdulRaufMujahid在评论中指出,如果自动实现的属性在一行上,您可以将光标定位在public bool IsUpdated { get; set; //set breakpoint on this line } get;并点击set;,并且断点将是相应地放置。尼斯!

F9

答案 3 :(得分:13)

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

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

当某人修改“m_value”的值时,您希望程序停止。

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

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

一旦我们停止了该计划:

调试 - &gt;新断点 - &gt;新数据断点......

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

现在,我们可以恢复该计划。当值改变时,调试器将停止。

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

class B
{
   private:
       A m_a;
};

地址:&amp;(this-&gt; m_a.m_value)

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

例如:

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

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

答案 4 :(得分:9)

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

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

    set { 
        m_var = value;
    }
}

答案 5 :(得分:3)

我记得你用Visual Basic 6.0描述它的方式。在Visual Studio中,到目前为止我找到的唯一方法是指定breakpoint condition

答案 6 :(得分:3)

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

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

答案 7 :(得分:2)

右键单击断点对我来说很好(虽然我主要使用它来处理特定变量值上的条件断点。即使打破涉及线程名称的表达式,如果你试图发现线程问题也非常有用)

答案 8 :(得分:2)

彼得·莫滕森(Peter Mortensen)写道:

  

在Visual Studio 2005菜单中:

     

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

     

输入:&myVariable

其他信息:

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

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

答案 12 :(得分:0)

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或更高版本)!