C# 当托管语言中的数据更改时中断的断点

C# 当托管语言中的数据更改时中断的断点,c#,debugging,breakpoints,C#,Debugging,Breakpoints,我有一个具有list属性的类,它在某些情况下似乎丢失了一个元素。我不知道这是什么时候发生的 因此,我想做的是设置一个VisualStudio断点,在该值更改时暂停程序。在这种情况下,条件断点不起作用,因为我不知道是什么删除了这个断点 换句话说,我希望我的程序在myList.Count计算为新数字时停止 有什么想法吗?用自己的类列出子类列表,然后覆盖Count或Add/Remove,并在创建的方法中添加断点 编辑:正如评论中提到的,这需要大量的工作,因为添加和删除方法不是虚拟的;需要完全重写这些方

我有一个具有list属性的类,它在某些情况下似乎丢失了一个元素。我不知道这是什么时候发生的


因此,我想做的是设置一个VisualStudio断点,在该值更改时暂停程序。在这种情况下,条件断点不起作用,因为我不知道是什么删除了这个断点

换句话说,我希望我的程序在myList.Count计算为新数字时停止

有什么想法吗?

用自己的类列出子类列表,然后覆盖Count或Add/Remove,并在创建的方法中添加断点

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


此外,子类化集合显然是一个更好的解决方案,尽管我不明白为什么添加/删除也不是集合的虚拟成员;注释?

由于CLR的限制,这在C或任何其他.NET语言中都是不可能的。VisualStudio本机代码调试器支持C++代码的数据断点,这些代码正好做到这一点,但托管代码不支持此数据断点。您可以按照此问题的另一个答案中的建议,尝试中断或拦截对集合的添加和删除方法调用。

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

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


或者您可以创建自己的IList实现,并设置断点以删除在不更改所有客户端的情况下无法对列表进行子类化的方法,因为List::Remove不是虚拟的。

这听起来可能太离谱或太复杂,但您可以使用计时器/后台线程继续测试计数值并执行调试器。只要发现值与其以前的实例不同,就中断。

我假设Visual Studio是IDE


设置断点,右键单击它,选择条件,键入myList.Count,然后选择“已更改”。

这可能是一个问题而不是答案,但如果您以这种方式设置Visual studio,则可以在调试时单步执行框架代码。您可以将断点放入实际的列表实现中。

将列表交换为ObservableCollection并侦听CollectionChanged事件怎么样?它实现了IList接口,因此在可用方法中应该有足够的重叠,以实现语法和语义兼容性。

这在Visual Studio 2019中现在是可能的。 请参见此处的发行说明:

本文将使用Preview 2详细介绍一些内容。


请注意,这仅适用于.NET Core,而不是即将推出的旧式完整Windows only.NET framework。

您无法覆盖添加/删除方法,因为它们不是虚拟的。您可以隐藏此方法并提供新版本,但在这种情况下,您应该将所有用法从List更改为MyList。如果您将List替换为Collection,则更可行;它不会给我我想要的结果。我想知道导致更改的确切行。在这种情况下,条件断点不起作用,因为我不知道删除此断点的原因。但这将停止执行,您可以检查违规者的调用堆栈:然而,它会;在这种情况下,我必须知道在哪里设置断点。我认为条件断点很好,并且一直在使用它们,但是在我写这个问题时的这个场景中,我不知道是哪行代码导致了这个问题。不过,我很欣赏你对这个问题的看法。谢谢我从来没有尝试过这一点,因为它与调试有关,但是您能否锁定对象以防止GC移动它?这是一个好主意!我不敢相信我之前没有想过使用ObservableCollection。当CollectionChange被调用时,有没有办法将堆栈追溯到进行更改的代码行?@Jason:是的,我想是的。由于事件是同步引发的,因此发起更改的代码应该出现在调用堆栈的某个位置,对我来说是有意义的。下次遇到类似情况时,我会尝试一下。谢谢我同意“查找所有用法”的建议。我希望有一个更简单的解决方案,但我理解为什么在VisualStudio中不可能实现
e语言谢谢。你说的~=,是什么意思?它的右手边是左手边的准确定义吗?如果没有,你能给出一个准确的定义吗?~=在本文中表示大约等于。谢谢。一般而言,它的定义是什么?在VS2019中,它现在是可能的,但仅适用于.Net Core 3.0及更高版本。请参阅VS2019的另一个答案。很有趣,但该功能似乎仅适用于.NET Core。此Microsoft博客表明,数据断点功能仅适用于.NET Core 3.0及更高版本中的托管代码: