假设我的类有一个名为count的私有整数变量。
我已经在我的代码中遇到了断点。现在,在我按下继续之前,我希望这样做,这样调试器就会在任何时候停止计数获得分配给它的新值。
除了将count计数到字段并在字段的set方法上设置断点之外,还有其他方法可以做到这一点吗?
答案 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的“内存访问中断”调试寄存器,调试器更容易,相反,实现代码位置断点。