当私有成员变量更改值时,如何在Visual Studio Debugger中停止执行?

时间:2009-02-05 17:59:17

标签: visual-studio debugging breakpoints watch

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

我已经在我的代码中遇到了断点。现在,在我按下继续之前,我希望这样做,这样调试器就会在任何时候停止计数获得分配给它的新值。

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

5 个答案:

答案 0 :(得分:3)

托管代码中无法找到您要查找的内容。在C ++中,这称为数据断点。它允许您在正在运行的程序更改内存块时中断。但这仅适用于纯本机C ++代码。

为什么没有实现这一点的简短版本是托管代码中的难度更大。本机代码很好且可预测。您创建内存并且除非您创建新对象(或显式复制内存),否则它不会移动。

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

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

答案 1 :(得分:0)

我假设您正在尝试这样做,因为您希望了解价值变化的来源。你已经说明了我一直这样做的方式:创建一个属性,然后在set访问器上中断(除非你必须总是使用那个set访问器才能工作)。

基本上,我会说,因为私有字段只是存储,所以你不能打破它,因为私有字段不是一个可破解的指令。

答案 2 :(得分:0)

我能想到的唯一方法是右键单击变量,然后选择“查找所有引用”。找到所有引用后,可以在代码中为变量赋值的每个点创建一个新断点。除非你通过引用另一个函数传递变量并更改其中的值,否则这很可能会很有效。在这种情况下,您需要某种方式来观察内存中的特定点以查看它何时发生变化。我不确定VS中是否存在这样的工具。

答案 3 :(得分:0)

像ChrisW评论的那样。您可以设置“数据断点”,但仅限于本机(非托管)代码。当垃圾收集器运行时,垃圾收集器将移动分配的内存块。因此,托管代码无法使用数据断点。

否则,不。您必须封装对您要“破坏修改”的项目的访问权限。由于已经是私人会员,我建议遵循Kibbee关于在任何地方设置断点的建议。

答案 4 :(得分:0)

  

除了将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的“内存访问中断”调试寄存器,调试器更容易,相反,实现代码位置断点。