我已经关注了代码:
private int a;
public int A
{
get{return a;}
set{a = value;}
}
我的问题是字段的价值' a'改变了运行时间,我试图调试谁正在改变它的值。没有提及字段' a'除了A.的设置者,我使用Visual Studio 2015进行调试,并设置了一个断点,其中A被设置,但断点永远不会被击中。
正因为如此,我认为有人可能会创造一个' a'通过反思。是否有任何选项可以设置应用程序,以便在私有字段' a'改变了?
答案 0 :(得分:4)
您可能想尝试不同的方法。如果您确定没有其他设置,并且您认为有人可能通过反射设置它,请更改它的名称。改为“_a”。这会影响反射,你可以确定价值仅由你的财产再次设定。此时,当应用程序崩溃时(假设某人实际上正在使用反射),那么您将在堆栈跟踪中看到它。
答案 1 :(得分:2)
还有其他可能的问题,例如托管堆损坏,它们也可能表现出相同的症状。如果您的应用程序因ExecutionEngineException崩溃,那么您需要搜索可能损坏托管堆的不安全和非托管代码。
Windbg可以提供一些支持ba (break on access)命令的帮助。在那里,您可以定义一个断点,当您写入特定的内存位置时,该断点会被触发。这并不像听起来那么容易,因为托管堆经常被压缩,这将导致您的对象经常移动。如果你能以某种方式固定对象,那么这可能是一种可行的调试方法。
Visual Studio支持此功能。它被称为Data Breakpoints,但由于上述原因,仅支持非托管代码。