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

Fly*_*wat 188 debugging breakpoints conditional-breakpoint visual-studio

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

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

可以这样做吗?

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

ASh*_*lly 127

在Visual Studio 2005菜单中:

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

输入:

&myVariable
Run Code Online (Sandbox Code Playgroud)

  • 这是否可用于托管代码?我看到C#项目禁用了此选项.记得在某处阅读这是一个很难实现调试托管应用程序的功能,特别是涉及垃圾收集器. (36认同)
  • 不幸的是,它仅适用于非托管代码:http://msdn.microsoft.com/en-us/library/350dyxd0.aspx (25认同)
  • 您还可以临时将字段转换为属性,并在getter或setter上放置断点. (16认同)
  • "Debug - > New Breakpoint"下的"Data Breakpoint"选项被禁用..任何想法为什么?它是否保持禁用或者不是我实际调试与否.我正在使用Visual Studio 2015. (10认同)
  • 有点晚了,但@jbb 对我来说只有当我在调试时在断点处停止时才启用它。 (3认同)
  • 对于托管代码,仅自 Visual Studio 2019 起才可以使用数据断点,但仅适用于 .Net Core(3.0 或更高版本)。请参阅有关 Visual Studio 2019 的答案并投票。 (2认同)

Mic*_*tta 27

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

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

Debugger.Break:如果未附加调试器,则会询问用户是否要附加调试器.如果是,则启动调试器.如果附加了调试器,则使用用户断点事件发出调试器信号,并且调试器暂停执行该进程,就像调试器断点已被命中一样.

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

  • FWIW,有编辑和继续,我更喜欢这样做:IME,条件断点是sloooow (2认同)

Cra*_*aig 26

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

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

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}
Run Code Online (Sandbox Code Playgroud)

更新

另外; @AbdulRaufMujahid在评论中指出,如果自动实现的属性在一行上,你可以将光标定位在get;or set;和hit上,F9并相应地放置一个断点.太好了!

public bool IsUpdated { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 即使自动实现的属性在一行中,例如公共字符串UserName {set; 得到; }.用户可以突出显示getter或setter,并可以按F9添加断点 (5认同)

mom*_*oco 13

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

class A  
{  
    public:  
        A();

    private:
        int m_value;
};
Run Code Online (Sandbox Code Playgroud)

当某人修改"m_value"的值时,您希望程序停止.

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

A::A()
{
    ... // set breakpoint here
}
Run Code Online (Sandbox Code Playgroud)

一旦我们停止了该计划:

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

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

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

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

class B
{
   private:
       A m_a;
};
Run Code Online (Sandbox Code Playgroud)

地址:&(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* ); 
Run Code Online (Sandbox Code Playgroud)

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

  • 那么,如果我要找的东西不在我自己的班级中,你到底会怎么做?例如,我试图找出控件在何处启用或禁用?当然,我可以在调试期间添加对控件的启用值的监视,但是没有办法让它在更改时中断,然后查看它停止的位置。 (2认同)
  • 如果您尝试调试外部库,则需要以调试模式编译的库.我对组件不熟悉,但也许你可以将"回调"连接到属性并在其中放置一个断点.我描述的表单需要内存地址,如果您无法知道,则需要搜索其他方法. (2认同)

小智 9

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

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

    set { 
        m_var = value;
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

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