解决为什么我的应用程序有时在加载期间“挂起”的提示

时间:2009-12-10 12:15:58

标签: c# .net winforms debugging

我有一个(相当大的)应用程序偶尔会在加载时被卡住 - 控件有一半画等。

从我设法从日志记录开始,这发生在_Load事件结束之后。

从Visual Studio运行时,我唯一一次发生这种情况,我尝试暂停,它只是把我带到了main的Application.Run行,所以这没什么用。

TaskMan并没有说应用程序“没有响应” - 但也许我没有等待足够长的时间来完成它(任何人都知道需要多长时间?)

我将继续尝试缩小范围(测试机器上的ProcessExplorer等),但如果有人对搜索方向有任何想法,那么在我开始将printfs全部放入我的代码之前... < / p>

5 个答案:

答案 0 :(得分:1)

使用dotTRACEANTS等分析器。此外,当您暂停时,如果您在另一个线程上运行代码,则可以通过选择:

切换到另一个线程

调试 - &gt; Windows - &gt;线程。

答案 1 :(得分:1)

您提供的诊断符合行为。表单的Load事件将是表单绘制之前运行的代码的最后一位。显示的事件将是下一个。调试器确实会停止在Application.Run()调用上,这是您编写的调试器具有源代码信息的最后一段代码。

关键是要仔细检查Call Stack窗口,Application.Run上面应该有额外的堆栈帧。如果导致挂起的代码是托管代码,那么最重要的是麻烦制造者。您将没有它的源代码,如果您需要该代码,使用Microsoft Reference Source服务器进行设置非常重要。

但它不太可能是托管代码,绝大多数Paint事件处理程序都是非托管代码,无论是在Windows还是某种ActiveX控件中。要深入了解这种代码,您需要启用非托管调试。 Project + Properties,Debug选项卡。此外,工具+选项,调试器,关闭“只是我的代码”。设置调试来自Microsoft符号服务器的符号对于理解堆栈跟踪非常重要,如果只在堆栈跟踪中获取十六进制地址,请执行此操作。

接下来,您应该能够通过观察正在绘制的内容和不绘制的内容来查看导致此问题的特定控件。控制按Z顺序绘制,你看不到,或只看到部分,应该是麻烦制造者。 Windows或.NET控件中的绘画挂起闻所未闻,怀疑您的表单上有任何类型的ActiveX控件。

答案 2 :(得分:0)

您可以尝试附加分析器并查看启动期间的时间。这可能会让你成为一名优秀的候选人。

答案 3 :(得分:0)

通过它的声音你可以在某处有一个无限循环。我会查看在Load事件之后发生的任何长卷绕过程和/或循环。

答案 4 :(得分:0)

如果调试器中没有出现问题,您可以运行该程序,等待它挂起,然后从Visual Studio中转到 Attach to Process ... (在Tools下) VS2005中的菜单。)

然后看另一张海报提到的线程。