如果VB6应用程序导致Application Hang事件出现在事件查看器中,我如何才能了解有关应用程序挂起原因的更多信息?
Application Hang事件是否意味着应用程序已经冻结和崩溃,或者只是暂时挂起?
我在此事件的事件日志中得到的所有信息是:
Hanging application [MyAppName].exe, version [MyAppVersionNo], hang module hungapp, version 0.0.0.0, hang address 0x00000000.这还不够,我希望能够找到更多关于它挂起的原因。需要执行哪些代码更改或其他步骤才能使应用程序在事件日志中提供更多详细信息?
发布于 2012-04-26 07:38:22
我建议使用Windows性能工具包。可使用的最佳版本是Windows评估和部署工具包http://www.microsoft.com/download/en/details.aspx?id=28997
安装完成后,您要做的就是启动Windows Performance Recorder (WPR)并单击start按钮开始录制。接下来,用你的应用重现这个问题。然后返回到WPR并按下保存按钮。接下来,加载Windows Performance Analyzer并打开生成的*.ETL文件。然后,您希望转到Graph Explorer中的System Activity部分,展开它,并找到UI延迟图(或者它可能是系统活动上驻留的第一个图)。双击它以在分析选项卡中获取详细版本。
一旦找到了您感兴趣的UI延迟,就可以从graph Explorer中的Processing节点添加另一个图,比如CPU使用率(采样)。当两个图表位于同一分析选项卡中时,它们的滚动和选择将同步。因此,您可以单击UI delay事件,它还将突出显示CPU使用率的相应范围。
发布于 2012-04-19 22:19:18
应用程序挂起事件表示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
如果您认为事件的原因是您的应用程序所做的事情(而不是应用程序正在运行的环境中的某些事情),那么您应该将日志信息级别提高到调试模式,并查看应用程序的日志文件,以了解它在变得无响应之前正在做什么,而不是试图将信息传递给挂起事件。
如果您的应用程序中缺少日志记录信息或日志记录框架,那么这就是您应该集中精力的地方。好处是,您将来也会从更好的日志记录中受益。但是,请使用日志记录框架,以便在一切顺利运行时,可以在生产环境中禁用调试级别日志记录。
发布于 2012-04-20 03:24:46
我将通过检查Windows确定已挂起的模块中的代码来解决此问题,该模块的名称已写入事件日志。尝试获取挂起事件中的更多详细信息将是不可能的,因为当Windows确定应用程序无响应时,为时已晚。
在挂起的模块中,我会添加多个对DoEvents的调用,并将状态消息直接记录到EventLog中。在这一点上添加日志记录框架将引入复杂性,并涉及存储日志的数据库或文件访问。
Windows认为应用程序已挂起,因为它已停止响应消息。不幸的是,与.NET不同的是,在你的VB6应用中实现第二个线程并不是微不足道的。无论如何,添加另一个线程可以保持应用的响应性,但你可能仍然需要回答这个问题,“为什么代码要花这么长的时间执行?”
https://stackoverflow.com/questions/10028792
复制相似问题