我有以下代码:
private int a;
public int A
{
get{return a;}
set{a = value;}
}
我的问题是字段'a‘的值在运行时被更改了,而我正在尝试调试谁在更改它的值。除了A的setter之外,没有对字段'a‘的引用。我正在使用Visual Studio 2015进行调试,并且有一个断点,其中设置了A,但断点永远不会命中。
正因为如此,我认为可能是有人通过反射设置了'a‘的值。有没有什么选项可以让应用程序在私有字段'a‘的值发生变化时中断?
发布于 2016-04-17 11:41:09
您可能想尝试一种不同的方法。如果您确定没有其他设置,并且您认为可能有人正在通过反射设置它,请更改它的名称。改为"_a“。这将阻碍反射,并且您可以确保该值再次仅由您的属性设置。在这一点上,当应用程序崩溃(假设有人正在使用反射)时,您将在堆栈跟踪中看到它。
发布于 2016-04-17 11:49:07
还有其他的可能性,比如托管堆损坏,这也可能表现出相同的症状。如果您的应用程序因ExecutionEngineException而崩溃,那么您需要搜索可能会破坏您的托管堆的不安全和非托管代码。
Windbg可以提供一些帮助,它支持ba (break on access)命令。在那里,您可以定义一个断点,当您写入特定的内存位置时将命中该断点。这并不像听起来那么简单,因为托管堆经常被压缩,这将导致您的对象经常移动。如果您能以某种方式固定对象,那么这可能是一种可行的调试方法。
Visual Studio支持此功能。它被称为Data Breakpoints,但由于上述原因,只有非托管代码才支持它。
https://stackoverflow.com/questions/36675974
复制