应用程序处于中断模式 - 无法确定原因

41

我的应用程序终止时,IDE有时会出现故障。

当出现此情况时,调用堆栈为空,并且线程列表显示一些不向我显示任何信息的线程。

当我选择“调试器” - “步入”时,IDE似乎正常退出/终止,所以我看不到如何进一步调查何导致了这种故障。

点击“检查正在运行的任务”不会显示任何任务。 单击“继续执行”似乎正常退出调试。 单击“显示诊断工具”会显示事件“停止执行:已停止执行”,这并没有告诉我更多信息。

附带了截图。

我如何调查是什么导致了这个问题?

输入图像描述

编辑: 我尝试了一个论坛成员建议的方法,但我认为这不会产生任何有助于我的东西。 这是一张截图:

输入图像描述


请查看任务管理器,检查与调试器工具/此项目相关的某些进程是否已关闭,您可以关闭它们,然后查看调试结果,或者只需重新启动计算机,重新打开项目,再次进行调试。确保在构建下运行“清理”,否则您可能会在您这边得到某些编译错误或异常。 - Jack Zhai
@JackZhai-MSFT,请详细解释我应该做什么。 - tmighty
1
看起来非常不健康。 Finalizer线程不再运行,但仍有三个线程运行托管代码。不好。水晶球显示您在程序终止时注意到了两秒超时,这是一个提示,Finalizer线程已死锁。你有充分的理由联系组件供应商的支持部门,Essential Objects提供的风险代码很可能会导致Finalizer线程死锁。 - Hans Passant
当我遇到类似的问题时,我的问题最终是由于线程方法上忘记了断点。在运行应用程序之前禁用所有断点可以证明或证伪这个理论。我不记得我的断点是否在一个引用项目中,但它肯定是相关的。 - blaze_125
9个回答

22

如果异常发生在你没有编写的库或其他组件中,可能无法看到异常发生的代码。以下操作可能有所帮助:

调试 > 选项 > 常规 > 取消选中 "启用我的代码"


13
在我的一个Web应用程序中,我遇到了同样的问题。在搜索了类似问题之后,大多数建议更改调试选项来找出问题所在。因此,在调试选项下的“常规”选项中,我标记了第二个选项“当一个进程中断时中断所有进程”,并且几乎在底部,勾选了“启用本机编辑和继续”;“应用更改并继续”。
通过这种方式,我的应用程序最终停止在出现问题的位置(字符串中存在非法字符,这是ajax不喜欢的)并且能够评估值并找出问题所在,并在代码运行期间进行编辑直至它正常工作。以下是我的调试器选项截图。
希望你也能找到你的错误:) 调试器选项

3
我现在有相同的调试选项,但很不幸没有帮助。我无法进入发生异常的位置,并且无法找出哪个COM对象引起了问题。 - tmighty
你说当你终止应用程序时发生了这种情况,那么将进程/进程放在一个或多个Try/catch方法中,看看它是否被异常捕获? - Alan Warden

4

前往异常设置并取消勾选“Magaged Debugging Assistants”。 输入图像描述


2
这有什么帮助? - DHLopez

4
我没有找到任何实际调试问题的方法。 我采用了一种简单粗暴的方式解决了这个问题:
我一个一个地删除程序集和COM对象,直到错误消失为止。
在我的情况下,我有一个带有模块中WithEvents的公共控件。似乎VB.NET根本不喜欢它。 从现在开始,我将把该控件及其WithEvent放在一个窗体中。
然而,主要的问题仍然存在:Visual Studio没有提供任何帮助来轻松隔离问题。

4
当您处于调试器中时,您可以导航到监视窗口并使用伪变量来显示有关根本原因的一些信息。其中一个特别有用的是$exception

enter image description here

查看有关pseudovariables的文档。


当问题发生时,IDE 会告诉我“无法评估表达式”。我已经在帖子中更新了它的截图。 - tmighty
在 Visual Studio 右侧点击“停止异常”时没有任何信息吗? - Paweł Łukasik
不,如果我点击它,什么也不会发生。当我将鼠标悬停在上面时,会显示消息“调试器捕获了异常,并且用户设置指示应该发生中断”。我已经编辑了我的帖子以显示这一点。 - tmighty

2

这可能是因为某个方法或构造函数不可访问(私有或内部),请将其设置为公共。

XAML需要调用方法来启动应用程序。


2

当单线程的Winforms应用程序在主线程中执行某个操作超过60秒时,也会发生此问题。

我通过从主线程定期调用Application.DoEvents()来以一种不太正规的方式解决了这个问题,在处理时间过长时这样做。在IDE中,出现在Application.DoEvents调用之间的异常被正确处理。


1
这种行为在任何地方有记录吗? - cbailiss

0

当您在调试模式下运行程序时,这只是一个警告消息。 如果您切换到“发布”模式,您将不会再看到此消息。


0
我遇到了类似的问题,当附加进程时会抛出异常,应用程序处于中断模式。我尝试了上述所有建议,例如:
  1. 调试 > 选项 > 常规 > 取消选中“启用仅限我的代码”
  2. 在发布模式下进行编译,而不是调试模式。
对我来说,有效的方法是使用并行堆栈搜索线索,然后发现我在HIDSharp.dll中调用了一个外部组件,创建的句柄没有被释放,没有使用dispose或close方法,因此它在使用外部资源,并导致中断模式。
希望这对其他人有所帮助,也要注意应用程序中的句柄或循环引用。

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