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

问题描述 投票:14回答:9

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

所以我想要做的是设置一个Visual Studio断点,它将在该值发生变化时暂停程序。条件断点在这种情况下不起作用,因为我不知道删除此断点的是什么。

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

关于如何做到这一点的任何想法?

c# debugging breakpoints
9个回答
16
投票

由于CLR限制,这在C#或任何其他.NET语言中是不可能的。 Visual Studio本机代码调试器支持C ++代码的数据断点(link),它完全是这样,但托管代码不支持此功能。您可以尝试按照此问题的其他答案中的建议打破或拦截AddRemove方法调用。


9
投票

怎么样换List<T>ObservableCollection<T>和听CollectionChanged事件?它实现了IList<T>接口,因此在可用方法中应该有足够的重叠,以产生语法和语义兼容性。


2
投票

我假设Visual Studio是IDE。

设置断点,右键单击它,选择条件,键入myList.Count,然后选择Has Changed。


2
投票

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

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

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


1
投票

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


1
投票

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

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


1
投票

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



0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.