在托管语言中数据更改时断开的断点
我有一个列表属性的类,在某些情况下似乎丢失了一个元素。 我不知道这发生的时间。
所以我想要做的是设置一个Visual Studio断点,它将在该值发生变化时暂停程序。 条件断点在这种情况下不起作用,因为我不知道删除此断点的是什么。
换句话说,我希望我的程序在myList.Count
评估为新数字时停止。
关于如何做到这一点的任何想法?
由于CLR限制,这在C#或任何其他.NET语言中是不可能的。 Visual Studio本机代码调试器支持C ++代码的数据断点( 链接 ),这完全相同,但托管代码不支持此function。 您可以尝试按照此问题的其他答案中的建议,打破或拦截对集合的“ Add
和“ Remove
方法调用。
那么为ObservableCollection
交换List
ObservableCollection
并监听CollectionChanged
事件呢? 它实现了IList
接口,因此在可用方法中应该有足够的重叠,以产生语法和语义兼容性。
我假设Visual Studio是IDE。
设置断点,右键单击它,选择条件,键入myList.Count,然后选择Has Changed。
子类列表
编辑:正如评论中所提到的,这需要大量的努力,因为添加和删除方法不是虚拟的; 需要完全重写这些方法。
另外,inheritanceCollection
您可以在visual studio中设置数据断点,但这对托管代码来说很难做到,因为垃圾收集器可能会移动对象。 也就是说,你仍然可以把它拉下来。 您必须为流程启用本机调试。 在即时窗口中加载SOS并使用!DumpObject查找Count
属性的后备存储的地址。 使用此地址,使用此地址创建新的数据断点,然后继续并触发该问题。
查找此特定属性的所有用法,并将断点添加到从此列表中删除元素的所有行。
或者您可以创建自己的IList实现并将断点设置为Remove方法(您不能在不更改所有客户端的情况下inheritanceList,因为List :: Remove不是虚拟的)。
这可能更像是一个问题而不是一个答案,但是你可以在调试时进入框架代码,前提是你以这种方式设置Visual Studio。 然后,您可以将断点放入实际的List实现中。
这可能听起来太偏僻或复杂,但你可以使用定时器/后台线程来测试计数值,并在发现与前一个实例不同的值时执行Debugger.Break()
。