在.NET IDE暂停程序时,是否可能执行此调试代码?

4

我有几个庞大的数据结构,在我的VB.NET应用程序中引起了问题。当抛出异常并且应用程序暂停时,我想运行一些代码,例如:

For Each o As MyClass In myObjects
  If o.property = "value" Then debug.print(o.id)
Next

诊断问题。

问题是即时窗口无法执行循环,而myObjects集合包含太多对象,我无法手动找到所需的有问题的对象。

当调试程序暂停时,如何找到此对象?在.NET IDE中是否可以实现这一点或类似的操作?

2个回答

6

您应该能够在IDE的即时模式窗口中执行类似于此的命令,但是数据必须在调试器当前作用域内可用。


你不能在即时窗口中运行循环。 - Omer Raviv
真的,但你可以使用.ForEach并调用一个操作方法来打印出每个项目。 - Erik Funkenbusch
我的对象(Dictionary)可以实现这个吗? - Flash
没错,@Andrew:我相信这里提到的ForEach方法就是出现在这篇帖子的第二个答案中的那个方法:https://dev59.com/onVD5IYBdhLWcg3wE3No 。你可以在Dictionary上使用它,但是你的操作方法应该接收一个KeyValuePair(IDictionary(Of TKey,TValue)是IEnumerable(Of KeyValuePair(Of TKey,TValue)))。当然,你仍然需要停止运行并重新编译以添加该方法。 - Omer Raviv
@Omer Raviv - 如果你正在进行32位开发,那么你可以使用编辑并继续功能,在不停止调试的情况下添加方法。 - Erik Funkenbusch

2
不,你不能直接从IDE中进行此操作。不幸的是,解决此问题最简单的方法是停止调试,在公共静态方法内编写循环以返回所需对象,重新编译并运行,然后在立即窗口或监视窗口中调用该公共静态方法。
另一个更为即时(但令人烦恼)的技巧是在立即窗口中写入“? myObjects”,将结果复制粘贴到记事本中,并使用文本搜索(Ctrl + F)在记事本中查找您的对象。

谢谢。有没有办法使 ? myObjects 给我超过 100 条记录?另外,相关的集合是一个包含另一个类的值的字典,这些值以 MyApp.MyClass 的形式出现而没有任何相关信息 - 是否有解决方法? - Flash
第一个问题 - 据我所知没有,抱歉。你也可以从观察窗口复制粘贴到记事本中。第二个问题 - 是的,你应该在MyClass上放置[DebuggerDisplay("ID: {id}")]。更多信息请参见http://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute.aspx。 - Omer Raviv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接