2012-04-05 1165 views
8

如果VB6应用程序导致事件查看器中显示Application Hang事件,那么如何了解应用程序挂起的原因?如何了解有关Application Hang事件的更多信息?

Application Hang事件是否意味着应用程序已经冻结并崩溃,或者只是暂时挂起?

所有我在事件日志中此事件得到的是:

Hanging application [MyAppName].exe, version [MyAppVersionNo], hang module hungapp, version 0.0.0.0, hang address 0x00000000. 

这是不够的,我希望能更多地了解为什么它被挂。需要进行哪些代码更改或其他步骤才能使应用在事件日志中提供更多详细信息?

+0

当您的应用程序忙时无法响应Windows消息,您的应用程序是否有长时间运行例程? – jac 2012-04-06 02:51:35

+0

不是我所知道的。该事件日志来自客户端站点。我希望该活动能够展示更多关于当时发生的事情的信息。 – CJ7 2012-04-06 07:05:12

+0

当应用程序挂起然后分析它并查看调用堆栈时,您可以执行进程内存转储(或让用户执行此操作)。 – MicSim 2012-04-19 11:45:39

回答

5

我推荐使用Windows Performance Toolkit。用最好的版本是Windows评估&部署工具包,http://www.microsoft.com/download/en/details.aspx?id=28997

安装完成后,你做的是启动Windows性能记录器(WPR),然后点击开始按钮开始录制。接下来,重现与您的应用程序的问题。然后返回WPR并按保存按钮。接下来,加载Windows性能分析器并打开生成的* .ETL文件。然后,您想要转到图形浏览器中的“系统活动”部分,展开它并找到UI延迟图(或者它可能是系统活动中的第一个图形)。双击它以获取分析选项卡中的详细版本。

一旦找到您感兴趣的UI延迟,您可以在Graph Explorer中的Processing节点添加另一个图形,例如CPU Usage(Sampled)。当这两个图形在同一个分析选项卡中时,它们的滚动和选择将被同步。因此,您可以单击UI延迟事件,并且还会突出显示CPU使用情况中的相应范围。

+0

上面的链接是死的,试试这个https://www.microsoft.com/en-US/download/details.aspx?id=39982它显示我只有ADK for Win 8.1 ... – Jakob 2016-01-26 09:07:19

+0

我认为这是它的一部分现在的SDK,从Windows 10开始。https://dev.windows.com/en-us/downloads/windows-10-sdk – 2016-01-26 19:43:41

2

应用程序挂起事件意味着Windows已决定应用程序没有响应。由于事件是由操作系统而不是应用程序生成的,因此您在事件中获取附加信息的选项非常有限。

这是似乎是可利用的应用程序事件杭:

消息:停止应用%1,版本%2,挂起模块%3,版本%4,悬挂地址0X%5。

来源:

http://www.microsoft.com/technet/support/ee/transform.aspx?ProdName=Windows+Operating+System&ProdVer=5.2&EvtID=1002&EvtSrc=Application+Hang&LCID=1033

如果您认为该事件的原因是什么,你的应用程序不会(如在应用程序运行环境反对的东西),然后,而不是试图通过信息到挂起事件,你应该提高日志信息的级别到调试模式,并查看你的应用程序的日志文件,看看它在没有响应之前正在做什么。

如果您的应用程序缺少日志记录信息或日志框架,那么是您应该集中精力的地方。好处是您将来也能从更好的采伐中受益。但是,使用日志记录框架时,可以在生产环境中禁用调试级别日志记录,这一切都可以顺利进行。

2

我会通过查看Windows确定已挂起的模块中的代码,将其名称写入事件日志来解决此问题。尝试在挂起事件中获得更多详细信息是不可能的,因为当Windows确定应用程序没有响应时,就太迟了。

在悬挂的模块中,我会向DoEvents添加多个调用,并将状态消息直接记录到EventLog中。此时添加日志记录框架会引入复杂性,并涉及用于存储日志的数据库或文件访问权限。

Windows认为应用程序已挂起,因为它已停止响应消息。不幸的是,在VB6应用程序中实现第二个线程不是微不足道的,与.NET不同。尽管如此,添加另一个线程会使应用程序响应,但是您可能仍然会回答“为什么代码需要很长时间才能执行?”这个问题。

0

从windows事件角度获取信息将无济于事。尝试在您的应用程序中进行跟踪,以帮助您获得确切的原因。

相关问题