我有一个随机冻结的应用程序,包括IDE,它让我发疯。这让我想知道:
找出随机冻结原因的一般策略是什么?
答案 0 :(得分:5)
如果您想从正在运行的应用程序外部进行检查,那么我可能会使用来自Mark Russonivich的sysinternals.com工具集,perfmon工具允许您跟踪文件/注册表访问并检查跟踪是否有延迟 - 什么是当时被访问。它将在那时显示DLL调用堆栈,正确的符号可用于调试导致延迟的应用程序外部的问题。 (我用它来发现与安全套件相关联的I / O过滤器是应用程序出现1.5秒延迟的原因。)
答案 1 :(得分:4)
如果你很幸运,你可以在调试器中运行代码直到它冻结,然后停止调试器找到有问题的代码行。但如果这很容易,你可能不会征求意见。 : - )
可以一起使用的两种策略是“分而治之”和“留下面包屑”。
分而治之:注释掉代码中越来越大的部分。如果它仍然冻结,则减少了可能导致冻结的代码量。警告:最终你会注释掉一些代码,程序将不冻结。这并不意味着最后一段代码必须负责冻结;它只是某种方式涉及。把它放回去并注释掉别的东西。
留下面包屑:让你的程序告诉你它在哪里以及它在执行时做了什么。显示消息,添加到日志文件,发出声音或通过网络发送数据包。执行路径是否符合您的预期?在冻结之前它最后做的是什么?同样,请注意,最后一条消息可能来自与负责冻结程序的线程不同的线程,但是当您接近原因时,您将调整代码记录的内容和位置。
答案 2 :(得分:2)
你可能不应该在UI线程中做事。
答案 3 :(得分:1)
我会安装UserDump工具,follow these instructions用于生成应用程序的用户转储....
一旦进行了用户转储,就可以使用WinDbg或cdb来检查线程,堆栈和锁等。
我经常发现挂起是由锁定的互斥锁或类似的东西引起的。
答案 4 :(得分:0)
好的一般策略是,运行程序直到它挂起。然后附加一个调试器,看看发生了什么。在GUI程序中,您最感兴趣的是UI线程正在做什么。
你说应用程序挂起了IDE。这不应该发生,我想这意味着程序对操作系统(可能是CPU负载或内存)施加了太大的压力,整个系统都在苦苦挣扎。
尝试运行它直到它挂起,返回IDE,然后单击“停止”按钮。你可能必须非常有耐心。如果IDE真的被永久卡住了,那么你必须提供有关你情况的更多细节以获得有用的帮助。