回答
如果幸运的话,您可以在调试器中运行您的代码直到它冻结,然后停止调试器以查找有问题的代码行。但如果这很容易,你可能不会征求建议。 :-)
可以一起使用的两种策略是“分而治之”和“留下面包屑”。
分而治之:注释掉越来越大的部分代码。如果它仍然冻结,你已经减少了可能导致冻结的代码量。 注意:最终你会注释掉一些代码,程序将而不是冻结。这并不意味着代码的最后一位必须是负责冻结;这只是不知何故涉及。把它放回去并注释掉别的东西。
假面包屑:让你的程序告诉你它在哪里以及它在执行时的功能。显示消息,添加到日志文件,发出声音或通过网络发送数据包。您预期的执行路径是什么?它在冻结之前做的最后一件事是什么?再次,请注意,最后一条消息可能来自与负责冻结程序的消息不同的线程,但当您更接近原因时,您将调整代码记录的内容和位置。
我会安装UserDump工具,follow these instructions生成的应用程序的用户转储....
一旦你的用户转储,您可以使用WinDbg或CDB检查线程,栈,和锁等。
我经常发现挂起是由锁定的互斥锁或类似的东西造成的。
当你不应该的时候,你可能在UI线程中做了些什么。
+1'occams'triage':) – 2009-11-27 23:26:44
这可能是可能的。有什么方法可以更好地查明确切原因? – 2009-11-28 11:31:21
如果您想从正在运行的应用程序之外进行检查,那么我可能会使用Mark Russonivich的sysinternals.com工具集,perfmon工具允许您跟踪文件/注册表访问并检查跟踪延迟 - 以及正在被访问。它将显示当时的DLL调用堆栈,正确的符号可用于调试导致延迟的应用程序外部的问题。 (我用它来发现一个与安全套件相关的I/O过滤器是一个应用程序嘎嘎了1.5秒延迟的原因。)
同意安德鲁。 Sysinternals工具是识别应用程序冻结的堆栈的一部分的最简单且最快速的方式 – 2009-11-27 23:49:49
好的一般策略是,运行程序直到它挂起。然后附加一个调试器,看看发生了什么。在一个GUI程序中,你最关心的是UI线程正在做什么。
你说应用程序挂起IDE。这不应该发生,我想这意味着程序正在给整个系统挣扎的操作系统(可能是CPU负载或内存)带来很大的压力。
尝试运行它直到它挂起,返回到IDE,然后单击“停止”按钮。你可能必须非常耐心。如果IDE真的永久停留,那么您必须提供有关您的情况的更多详细信息以获得有用的帮助。
- 1. 调试策略找到bad_alloc的原因
- 2. 高速缓存“随机”数据的一般策略
- 3. 寻找随机数
- 4. C#的WinForms:调试策略,找到原因System.AccessViolationException
- 5. Qt冻结循环的原因?
- 6. 寻找一些聪明的SQL策略来处理查找表
- 7. 寻找NaN的错误的原因
- 8. 角度释放时间一般策略?
- 9. 的Android:的ServerSocket.accept()随机冻结
- 10. 寻找ASP的原因错误
- 11. 寻找多线程死锁的原因?
- 12. 随机断点未知的原因
- 13. 如何将随机策略与Q值迭代相结合?
- 14. Coldfusion和mySQL - 寻求一般和异地备份策略的推荐
- 15. 仿真程序随机冻结
- 16. Python多线程冻结(?)随机
- 17. 寻找随机团队PHP脚本
- 18. 复杂的多阶段搜索的一般策略
- 19. 在Ajax中抛弃相同原点策略的原因是什么?
- 20. neo4j时间树会被冻结的原因是什么?
- 21. enumerateObjectsWithOptions:usingBlock:引起频繁不明原因的冻结
- 22. 3种方法冻结的原因是什么?
- 23. 导致此应用冻结的原因是什么?
- 24. 寻找一个交互式决策树
- 25. 为asp.net寻找正确的缓存和压缩策略
- 26. 寻找更多有关loopback +护照策略的信息
- 27. 寻找避免小程序重载的可能策略
- 28. 解决Java内存泄漏的一般策略?
- 29. Haskell - 寻找一个整数的因子
- 30. 找不到原因坠机试飞
+1为“穷人的调试”。 – 2009-12-03 17:41:06
这个问题被标记为“语言不可知”,所以我不想对平台或工具做任何假设。尽管所有糟糕的新闻,你可以用printf()和一些聪明的东西走很长的路。 – 2009-12-09 13:16:58