有没有办法对变量进行监视,并且只有在该值更改时才让 Visual Studio 中断?
这将使查找棘手的状态问题变得更加容易。
这可以做到吗?
断点条件仍然需要设置断点,我宁愿设置一个手表,让 Visual Studio 在状态更改时设置断点。
有没有办法对变量进行监视,并且只有在该值更改时才让 Visual Studio 中断?
这将使查找棘手的状态问题变得更加容易。
这可以做到吗?
断点条件仍然需要设置断点,我宁愿设置一个手表,让 Visual Studio 在状态更改时设置断点。
在 Visual Studio 2005 菜单中:
调试->新断点->新数据断点
进入:
&myVariable
您还可以选择在代码中显式中断:
// Assuming C#
if (condition)
{
System.Diagnostics.Debugger.Break();
}
来自 MSDN:
Debugger.Break:如果没有附加调试器,则询问用户是否要附加调试器。如果是,则启动调试器。如果附加了调试器,调试器会收到用户断点事件的信号,并且调试器会暂停进程的执行,就像遇到了调试器断点一样。
不过,这只是一个后备方案。如其他评论中所述,在 Visual Studio 中设置条件断点是更好的选择。
在Visual Studio 2015set
中,您可以在自动实现的属性的访问器上放置断点,当属性更新时调试器将中断
public bool IsUpdated
{
get;
set; //set breakpoint on this line
}
更新
或者; @AbdulRaufMujahid 在评论中指出,如果自动实现的属性在单行上,您可以将光标定位在get;
orset;
并点击F9
,相应地会放置一个断点。好的!
public bool IsUpdated { get; set; }
想象一下,您有一个名为 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* );
如果您查看“调用堆栈”,您可以看到更改变量值的函数。
将变量更改为属性,并在 set 方法中添加断点。例子:
private bool m_Var = false;
protected bool var
{
get {
return m_var;
}
set {
m_var = value;
}
}
如果您使用 WPF,有一个很棒的工具:WPF Inspector。
它将自身附加到 WPF 应用程序并显示具有所有属性的完整控件树,它允许您(除其他外)在任何属性更改时中断。
但遗憾的是,我没有找到任何工具可以让你对任何属性或变量做同样的事情。
2019年更新:
现在,适用于 .Net Core 3.0 或更高版本的 Visual Studio 2019 Preview 2 正式支持此功能。当然,您可能需要考虑使用预览版 IDE 的潜在风险。我想在不久的将来这将包含在官方的 Visual Studio 中。
幸运的是,数据断点不再是 C++ 独有的,因为它们现在可用于 Visual Studio 2019 Preview 2 中的 .NET Core(3.0 或更高版本)!
我记得您使用Visual Basic 6.0描述它的方式。在 Visual Studio 中,到目前为止我发现的唯一方法是指定断点条件。
右键单击断点对我来说效果很好(尽管大多数情况下我将它用于特定变量值的条件断点。即使在涉及线程名称的表达式上中断也可以,如果您试图发现线程问题,这非常有用)。
正如彼得莫滕森所写:
在 Visual Studio 2005 菜单中:
调试 -> 新断点 -> 新数据断点
输入:&myVariable
附加信息:
显然,系统必须知道要监视内存中的哪个地址。myVariable
所以 - 为(或)的初始化设置一个正常的断点myClass.m_Variable
- 运行系统并等待它在该断点处停止。- 现在菜单项已启用,您可以通过输入来观察变量&myVariable
,或者通过输入来观察实例&myClass.m_Variable
。现在地址已经很好地定义了。
抱歉,当我通过解释已经给出的解决方案做错事时。但我无法添加评论,并且对此有一些评论。
您可以在非托管代码中使用内存观察点。不确定这些是否在托管代码中可用。
您可能可以巧妙地使用DebugBreak()函数。
您可以选择为变量重载 = 运算符,并可以在特定条件下将断点放在重载函数中。