我目前正在处理的程序偶尔会出现AppHangB1问题事件。我已将其追溯到一系列特定的动作,但它似乎是一种heisenbug,因为每当我单步执行代码时,它都不会表现出来。一旦程序挂起,我就无法暂停程序以查看它在Visual Studio中的挂起位置。这个应用程序中有很多事情发生(非托管互操作,多线程等),因此在我的特定应用程序中可能出现任何数量的错误。
我不是在寻找任何人为我解决我的问题,我只是想知道什么类型的东西可能导致这种类型的挂起?我在Google上发现了一些点击,但没有任何帮助。任何可以帮助查明问题的.NET应用程序的调试技巧也会有所帮助。
答案 0 :(得分:7)
当UI线程几秒钟没有响应消息并且用户尝试终止消息时,会触发AppHangB1事件。几乎任何事情都可能导致挂起:代码中的繁忙循环,在UI线程上执行网络或磁盘I / O,在执行长时间运行任务的后台线程持有的锁上阻塞UI线程等等。
有点担心Visual Studio在挂起时无法破解。您是附加到仅托管调试还是混合模式调试?您可以尝试使用Windbg(http://www.microsoft.com/whdc/devtools/debugging/default.mspx)非侵入性地附加到进程并尝试获取挂起线程的堆栈跟踪(您希望查看使用!clrstack来获取托管堆栈跟踪)。 Windbg的学习曲线非常陡峭,因此您可能只想收集可在Visual Studio中调试的转储。