繁体   English   中英

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

[英]Tips for working out why my application sometimes 'hangs' during Load

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

从我设法从日志记录中得出的结果来看,这发生在_Load事件结束之后。

从Visual Studio运行时,这是我唯一的一次尝试,尝试暂停一下,它只是将我带到main中的Application.Run行,所以并没有太大帮助。

TaskMan并不是说应用程序“没有响应”-但是也许我没有等待足够长的时间来解决该问题(任何人都知道需要多长时间?)

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

使用诸如dotTRACEANTS之类的探查器。 同样,在暂停时,如果代码在另一个线程上运行,则可以通过选择以下命令切换到另一个线程:

调试-> Windows->线程

您提供的诊断与行为匹配。 表单的Load事件将是表单绘制自身之前运行的代码的最后一部分。 Shown事件将是下一个。 调试器确实会停止对Application.Run()的调用,这是您编写的代码的最后一部分,调试器具有源代码信息。

关键是要仔细检查``调用堆栈''窗口,在应用程序上方应有其他堆栈帧。运行一个。 如果导致挂起的代码是托管代码,则最麻烦的是麻烦制造者。 您将没有源代码,如果需要该代码,则使用Microsoft Reference Source服务器进行设置非常重要。

但是它不太可能是托管代码,在Windows或某种ActiveX控件中,绝大多数的Paint事件处理程序都是非托管代码。 要深入了解此类代码,您需要启用非托管调试。 项目+属性,调试选项卡。 另外,在“工具+选项”,“调试器”中,关闭“仅我的代码”。 从Microsoft的符号服务器进行调试符号的设置对于理解堆栈跟踪可能很重要,如果仅在堆栈跟踪中获取十六进制地址,则应这样做。

接下来,您应该能够通过观察油漆和不油漆来查看是什么特定的控件导致了此问题。 控件按Z顺序绘制,您看不到或仅部分看到的控件应该是制造麻烦的人。 Windows或.NET控件上的绘画挂起是闻所未闻的,怀疑您的窗体上有任何类型的ActiveX控件。

您可以尝试附加探查器,并查看启动过程中花费的时间。 那可能会指出你是一个好的候选人。

听起来,您可能会在某处无限循环。 我将研究在您的Load事件之后发生的任何漫长的过程和/或循环。

如果调试器中未出现问题,则可以运行该程序,等待其挂起,然后从Visual Studio中转到“ 附加到进程...” (在VS2005中的“工具”菜单下)。

然后看一看其他海报中提到的主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM