2009-11-27 92 views

回答

4

如果幸运的话,您可以在调试器中运行您的代码直到它冻结,然后停止调试器以查找有问题的代码行。但如果这很容易,你可能不会征求建议。 :-)

可以一起使用的两种策略是“分而治之”和“留下面包屑”。

分而治之:注释掉越来越大的部分代码。如果它仍然冻结,你已经减少了可能导致冻结的代码量。 注意:最终你会注释掉一些代码,程序将而不是冻结。这并不意味着代码的最后一位必须是负责冻结;这只是不知何故涉及。把它放回去并注释掉别的东西。

假面包屑:让你的程序告诉你它在哪里以及它在执行时的功能。显示消息,添加到日志文件,发出声音或通过网络发送数据包。您预期的执行路径是什么?它在冻结之前做的最后一件事是什么?再次,请注意,最后一条消息可能来自与负责冻结程序的消息不同的线程,但当您更接近原因时,您将调整代码记录的内容和位置。

+0

+1为“穷人的调试”。 – 2009-12-03 17:41:06

+0

这个问题被标记为“语言不可知”,所以我不想对平台或工具做任何假设。尽管所有糟糕的新闻,你可以用printf()和一些聪明的东西走很长的路。 – 2009-12-09 13:16:58

1

我会安装UserDump工具,follow these instructions生成的应用程序的用户转储....

一旦你的用户转储,您可以使用WinDbg或CDB检查线程,栈,和锁等。

我经常发现挂起是由锁定的互斥锁或类似的东西造成的。

2

当你不应该的时候,你可能在UI线程中做了些什么。

+0

+1'occams'triage':) – 2009-11-27 23:26:44

+0

这可能是可能的。有什么方法可以更好地查明确切原因? – 2009-11-28 11:31:21

5

如果您想从正在运行的应用程序之外进行检查,那么我可能会使用Mark Russonivich的sysinternals.com工具集,perfmon工具允许您跟踪文件/注册表访问并检查跟踪延迟 - 以及正在被访问。它将显示当时的DLL调用堆栈,正确的符号可用于调试导致延迟的应用程序外部的问题。 (我用它来发现一个与安全套件相关的I/O过滤器是一个应用程序嘎嘎了1.5秒延迟的原因。)

+0

同意安德鲁。 Sysinternals工具是识别应用程序冻结的堆栈的一部分的最简单且最快速的方式 – 2009-11-27 23:49:49

0

好的一般策略是,运行程序直到它挂起。然后附加一个调试器,看看发生了什么。在一个GUI程序中,你最关心的是UI线程正在做什么。

你说应用程序挂起IDE。这不应该发生,我想这意味着程序正在给整个系统挣扎的操作系统(可能是CPU负载或内存)带来很大的压力。

尝试运行它直到它挂起,返回到IDE,然后单击“停止”按钮。你可能必须非常耐心。如果IDE真的永久停留,那么您必须提供有关您的情况的更多详细信息以获得有用的帮助。