Visual studio 当私有成员变量更改值时,如何停止Visual Studio调试器中的执行?

Visual studio 当私有成员变量更改值时,如何停止Visual Studio调试器中的执行?,visual-studio,debugging,breakpoints,watch,Visual Studio,Debugging,Breakpoints,Watch,假设我的类有一个名为count的私有整数变量 我已经在代码中遇到了一个断点。现在,在我按下continue之前,我想让它在count获得分配给它的新值时停止 除了将count提升为字段并在字段的set方法上设置断点外,还有其他方法可以做到这一点吗?我假设您尝试这样做是因为您想查看值的更改来自何处。您已经说明了我一直使用的方法:创建一个属性,然后断开set访问器(除非您必须始终使用该set访问器才能工作) 基本上,我会说,由于私有字段是唯一的存储,所以不能在其上中断,因为私有字段不是可中断的指令。

假设我的类有一个名为count的私有整数变量

我已经在代码中遇到了一个断点。现在,在我按下continue之前,我想让它在count获得分配给它的新值时停止


除了将count提升为字段并在字段的set方法上设置断点外,还有其他方法可以做到这一点吗?

我假设您尝试这样做是因为您想查看值的更改来自何处。您已经说明了我一直使用的方法:创建一个属性,然后断开set访问器(除非您必须始终使用该set访问器才能工作)


基本上,我会说,由于私有字段是唯一的存储,所以不能在其上中断,因为私有字段不是可中断的指令。

我认为实现这一点的唯一方法是右键单击变量,然后选择“查找所有引用”。找到所有引用后,可以在代码中为变量赋值的每个点上创建一个新断点。这可能工作得很好,除非您通过引用将变量传入另一个函数并更改其中的值。在这种情况下,您需要某种方式来观察内存中的特定点,以查看它何时发生变化。我不确定VS.中是否存在类似ChrisW评论的工具。您可以设置“数据断点”,但只能为本机(非托管)代码设置。当垃圾收集器运行时,垃圾收集器将移动分配的内存块。因此,托管代码不可能有数据断点

否则,不能。您必须封装对要“修改时中断”的项目的访问权限。由于它已经是一个私有成员,我建议遵循Kibbee的建议,在使用它的地方设置断点

除了将count提升为字段并在字段的set方法上设置断点之外,还有其他方法可以做到这一点吗

使其成为其他类的属性,创建该类的实例,并在该属性上设置断点

而不是

test()
{
   int i = 3;
   ...etc...
   i = 4;
}
。。。有

class Int
{
  int m;
  internal Int(int i) { m = i; }
  internal val { set { m = value; } get { return m; } }
}

test()
{
  Int i = new Int(3);
   ...etc...
   i.val = 4;
}

问题是,使用C#,所有东西的实际内存位置都在不断移动:因此调试器无法轻松使用CPU的“内存访问中断”调试寄存器,调试器更容易实现代码位置断点。

在托管代码中不可能实现您要查找的内容。在C++中,这就是所谓的数据断点。它允许您在运行程序更改内存块时中断。但这只能在纯本机C++代码中使用。p> 之所以没有实现这一点,一个简短的解释是,在托管代码中要困难得多。本机代码是好的和可预测的。创建内存时,除非创建新对象(或显式复制内存),否则内存不会移动

托管代码要复杂得多,因为它是一种垃圾收集语言。CLR通常在内存中移动对象。因此,仅仅看一点记忆是不够的。它需要GC交互


这只是实现托管断点的问题之一

什么语言?如果你使用的是非托管C++,微软评论: