我有一个带有list属性的类,在某些情况下它似乎丢失了一个元素。我不知道这发生的时间。
所以我想要做的是设置一个Visual Studio断点,该值将在此值发生变化时暂停程序。条件断点在这种情况下不起作用,因为我不知道删除这个断点是什么。
换句话说,我希望我的程序在myList.Count
评估为新数字的那一刻停止。
关于如何做到这一点的任何想法?
答案 0 :(得分:16)
由于CLR限制,这在C#或任何其他.NET语言中是不可能的。 Visual Studio本机代码调试器支持C ++代码的数据断点(link),这些代码完全相同,但托管代码不支持此功能。您可以尝试按照此问题的其他答案中的建议,打破或拦截集合上的Add
和Remove
方法调用。
答案 1 :(得分:9)
如何为List<T>
换取ObservableCollection<T>
并听取CollectionChanged
事件?它实现了IList<T>
接口,因此在可用方法中应该有足够的重叠,以产生语法和语义兼容性。
答案 2 :(得分:2)
子类列表&lt; t&gt;使用您自己的类,然后覆盖Count(或Add / Remove)并在您创建的方法中添加断点。
编辑:正如评论中所提到的,这需要付出很多努力,因为“添加”和“删除”方法不是虚拟的;需要完全重写这些方法。
此外,继承Collection&lt; t&gt;显然是一个更好的解决方案(虽然我无法分辨为什么因为添加/删除不是Collection&lt; t&gt;的虚拟成员;注释?)。
答案 3 :(得分:2)
我假设Visual Studio是IDE。
设置断点,右键单击它,选择条件,键入myList.Count,然后选择Has Changed。
答案 4 :(得分:1)
您可以在visual studio中设置数据断点,但这对于托管代码来说很难做到,因为垃圾收集器可能会移动对象。也就是说,你仍然可以把它拉下来。您必须为流程启用本机调试。在即时窗口中加载SOS并使用!DumpObject查找Count
属性的后备存储的地址。使用此地址,使用此地址创建新的数据断点,然后继续并触发该问题。
答案 5 :(得分:1)
查找此特定属性的所有用法,并将断点添加到从此列表中删除元素的所有行。
或者您可以创建自己的IList实现并将断点设置为Remove方法(您不能在不更改所有客户端的情况下继承List,因为List :: Remove不是虚拟的)。
答案 6 :(得分:1)
这可能更像是一个问题而不是一个答案,但是你可以在调试时进入框架代码,只要你以这种方式设置你的Visual Studio。然后,您可以将断点放入实际的List实现中。
答案 7 :(得分:0)
这可能听起来太复杂或复杂,但是你可以使用计时器/后台线程继续测试计数值,并在发现值与前一个实例不同时执行Debugger.Break()
。
答案 8 :(得分:0)
现在可以在Visual Studio 2019中使用它。 请在此处查看发行说明:https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes
本文使用预览版2进行了详细介绍。 https://devblogs.microsoft.com/visualstudio/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/