2009-12-10 58 views
0

期间我有偶尔被“卡住”,而加载(相当大的)应用程序 - 半绘控件等提示工作,为什么我的应用程序有时会“挂起”负载

从我所管理从日志记录开始,这发生在_Load事件结束后。

我从Visual Studio运行的唯一一次发生,我试着做了一个暂停,它只是把我带到主要的Application.Run行,所以没有多大帮助。

taskman的不说,该应用程序是“没有响应” - 但也许我不会等待足够长的时间,它的工作说出来(任何人都知道需要多长时间?)

我要去继续尝试缩小范围(测试机器上的ProcessExplorer等),但是如果任何人有任何想要搜索的方向,在我开始将printfs全部通过我的代码之前...

回答

1

使用类似的分析器dotTRACEANTS。另外,当你暂停时,如果你的代码在另一个线程上运行,你可以通过选择切换到另一个线程:

Debug - > Windows - > Threads。

0

您可以尝试附加分析器并查看启动过程中何时花费的时间。这可能表明你是一个好人选。

0

通过它的声音,你可以有一个无限循环的地方。我会看看Load事件之后发生的任何漫长的过程和/或循环。

+0

是的,但有时只是一个无限循环,这是我无法理解的。 – Benjol 2009-12-10 12:43:49

+0

是的,所以我会检查你的所有循环,即通过它们并仔细检查它们是否不依赖于设置的任何特定标志。再次,它只是在黑暗中拍摄,因为没有代码供我调试:) – James 2009-12-10 12:50:51

0

如果在调试器中没有发生问题,您可以运行该程序,等待它挂起,然后从Visual Studio中去附加到进程...(在VS2005的工具菜单下) 。

然后通过提到的其他海报来看看主题。

1

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

关键是要仔细检查调用堆栈窗口,在Application.Run之上应该有额外的堆栈框架。如果导致挂起的代码是托管代码,则排在前面的是麻烦制造者。如果您需要该代码,您将无法使用源代码,因此使用Microsoft Reference Source服务器进行安装非常重要。

但是它不太可能是托管代码,绝大多数Paint事件处理程序都是非托管代码,无论是在Windows中还是某种ActiveX控件。要深入了解这类代码,您需要启用非托管调试。项目+属性,调试选项卡。另外,Tools + Options,Debugger关闭“Just my code”。从微软的符号服务器调试符号的设置对于理解堆栈跟踪很重要,如果只在堆栈跟踪中获得十六进制地址,那么这样做很重要。

接下来,您应该能够通过观察正在绘制的内容以及没有绘制的内容来了解​​特定的控件是如何引起此问题的。控制按照Z顺序绘制,你看不到,或只看到一部分,应该是麻烦制造者。绘画挂在Windows或.NET控件是闻所未闻,怀疑您的窗体上的任何类型的ActiveX控件。

相关问题