VS2010调试器陷入困境

3
我正在开发一个大型多线程C#程序,从几个VS2010项目/解决方案中加载多个DLL。调试它比我预期的要困难得多(谁能想到呢)。
问题如下。经常情况下,在一些步骤或中断操作后,程序(或者可能是调试器)会进入某种既不运行也不停止的不确定状态。在菜单中,和都变灰了,所以我无法继续使用程序。
有时候,但并不总是,当这种情况发生时,我看到观察窗口中显示的消息:
Function evaluation disabled because a previous function evaluation timed out.
程序似乎没有运行(没有输出,没有在断点上停止...),也似乎没有停止(观察窗口被禁用,调用堆栈窗口为空)。

1
听起来像是死锁或无限循环。你尝试过获取内存转储并以那种方式检查程序状态吗? - Conrad Frix
@ConradFrix:我想能够在源代码级别停止和检查我的程序,无论它处于执行的任何状态。在过去的20年中,我有机会在各种Unix版本下使用几个调试器,每一个都可以做到这一点,无限循环,死锁或其他情况。现在我必须求助于内存转储?在所有东西中都要用Windows?请告诉我不是这样。 - n. m.
@ConradFrix:此外,调试器经常在简单跨越非常简单的代码行之后进入此状态,没有可能循环或死锁的任何函数调用。因此,这不可能是一个原因。 - n. m.
1
调试器在一个非常简单的代码行上使用简单跨步操作时,经常会进入此状态。也许您调试的不是代码行,而是您观察的某些东西。 - Conrad Frix
嗯,我很确定我的手表中没有任何表达式可能会死锁或循环,但是删除所有手表似乎解决了这个问题,至少现在是这样。即使有一个糟糕的手表表达式,那也太糟糕了。调试器不应该因为程序中有错误而停止工作... - n. m.
显示剩余4条评论
1个回答

2
如@Conrad Frix所说,您最好的选择可能是采取内存转储并检查您的线程正在执行什么操作。有许多可用于Windows和.Net开发的工具,每个工具都为表格带来了一些不同的东西: Windbg - 基于文本的内存检查。非常适合深入挖掘框架/操作系统并检查线程堆栈,但学习曲线相对陡峭。(然而没有比这更强大的工具) JetBrains dotTrace - 如果您使用Reshaper,则与之集成。但我在使用过程中效果不是最好的。 RedGate ANTS - 我最喜欢的“现代”基于GUI的分析器之一。这可以给你很好的洞察力,以了解您的线程正在做什么,但如果您的应用程序中有数百个线程,则可能有点难以处理。
Jetbrains和RedGate是付费产品,因此您可能需要使用它们的免费试用版本来解决问题。

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