是否有一种方法可以将一个手表放在变量上,并且只在该值发生变化时才有Visual Studio中断?
这将使找到棘手的州问题变得容易得多。
这能做到吗?
断点条件仍然需要断点设置,我宁愿设置一个监视表,让Visual Studio在状态更改时设置断点。
是否有一种方法可以将一个手表放在变量上,并且只在该值发生变化时才有Visual Studio中断?
这将使找到棘手的州问题变得容易得多。
这能做到吗?
断点条件仍然需要断点设置,我宁愿设置一个监视表,让Visual Studio在状态更改时设置断点。
你也可以选择在代码中显式中断:
// Assuming C#
if (condition)
{
System.Diagnostics.Debugger.Break();
}
从MSDN:
调试器。打破: 如果没有附加调试器,则会附加用户 问他们是否要附上 调试器。如果是,则调试器处于 开始了。如果附加了调试器, 调试器使用用户发出信号 断点事件和调试器 暂停进程的执行 就好像是调试器断点 打击。
不过,这只是一个备用方案。在Visual Studio中设置条件断点(如其他评论中所述)是更好的选择。
假设您有一个名为a的类,声明如下。
class A
{
public:
A();
private:
int m_value;
};
当有人修改了"m_value"的值时,你希望程序停止。
转到类定义并在a的构造函数中放置断点。
A::A()
{
... // set breakpoint here
}
一旦我们停止程序:
调试->新断点->新数据断点…
地址:&(这- > m_value) 字节计数:4(因为int有4个字节)
现在,我们可以继续这个项目了。当值被更改时,调试器将停止。
您可以对继承类或复合类进行同样的操作。
class B
{
private:
A m_a;
};
地址:&(这- > m_a.m_value)
如果不知道要检查的变量的字节数,可以使用sizeof操作符。
例如:
// to know the size of the word processor,
// if you want to inspect a pointer.
int wordTam = sizeof (void* );
如果你看一下“调用堆栈”,你可以看到改变变量值的函数。
如果你正在使用WPF,有一个很棒的工具:WPF检查器。 它将自己连接到WPF应用程序,并显示具有所有属性的完整控件树,它允许你(在其他事情中)打破任何属性更改。
但遗憾的是,我没有找到任何工具,可以让你做同样的任何属性或变量。
将变量更改为属性,并在set方法中添加断点。例子:
private bool m_Var = false;
protected bool var
{
get {
return m_var;
}
set {
m_var = value;
}
}
在Visual Studio 2015中,你可以在自动实现属性的set访问器上放置断点,当属性更新时,调试器将中断
public bool IsUpdated
{
get;
set; //set breakpoint on this line
}
更新
另外;@AbdulRaufMujahid在评论中指出,如果自动实现的属性在单行上,你可以将光标定位在get;或一组;按下F9,断点就会随之出现。好了!
public bool IsUpdated { get; set; }
正如彼得·莫滕森所写:
在Visual Studio 2005菜单中: 调试->新断点->新数据断点 输入:myvariable
附加信息:
显然,系统必须知道要监视内存中的哪个地址。 所以 -设置一个正常断点初始化myVariable(或myClass.m_Variable) -运行系统并等待它在该断点停止。 -现在菜单项已启用,您可以通过输入&myVariable来查看变量, 或实例,输入&myClass.m_Variable。现在地址已经定义好了。
抱歉,我解释了一个已经给出的解。但我不能对此发表评论,关于这一点已经有了一些评论。
2019年更新:
现在,针对. net Core 3.0或更高版本的Visual Studio 2019预览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预览2中可用于.NET Core(3.0或更高版本)!