在托管语言中数据更改时断开的断点

我有一个列表属性的类,在某些情况下似乎丢失了一个元素。 我不知道这发生的时间。

所以我想要做的是设置一个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。

子类列表使用您自己的类,然后重写Count(或Add / Remove)并在您创建的方法中添加断点。

编辑:正如评论中所提到的,这需要大量的努力,因为添加和删除方法不是虚拟的; 需要完全重写这些方法。

另外,inheritanceCollection 显然是一个更好的解决方案(虽然我无法分辨为什么因为Add / Remove不是Collection 的虚拟成员;注释?)。

您可以在visual studio中设置数据断点,但这对托管代码来说很难做到,因为垃圾收集器可能会移动对象。 也就是说,你仍然可以把它拉下来。 您必须为流程启用本机调试。 在即时窗口中加载SOS并使用!DumpObject查找Count属性的后备存储的地址。 使用此地址,使用此地址创建新的数据断点,然后继续并触发该问题。

查找此特定属性的所有用法,并将断点添加到从此列表中删除元素的所有行。

或者您可以创建自己的IList实现并将断点设置为Remove方法(您不能在不更改所有客户端的情况下inheritanceList,因为List :: Remove不是虚拟的)。

这可能更像是一个问题而不是一个答案,但是你可以在调试时进入框架代码,前提是你以这种方式设置Visual Studio。 然后,您可以将断点放入实际的List实现中。

这可能听起来太偏僻或复杂,但你可以使用定时器/后台线程来测试计数值,并在发现与前一个实例不同的值时执行Debugger.Break()