解决 Mac OS X 上应用程序挂起的问题

解决 Mac OS X 上应用程序挂起的问题

最近我在 OSX 上的不同应用中看到很多旋转的沙滩球。右键单击时,它们似乎经常发生,但这种情况并不局限于单个应用。Safari、Adium、NetNewsWire 等都出现这种情况。我的直觉是,有一些常见的功能/插件/例程导致了这种情况,可能是由一些第三方扩展或我启用的其他程序引起的。

解决此类问题的最佳方法是什么?我能以某种方式转储挂起的应用程序以查看它试图做什么吗?我可以采取一些措施来追踪可能导致这种情况的原因吗?

答案1

一款用于追踪挂起情况的实用程序名为 Spin Control,它与 Apple 的 Developer Tools 一起安装在/Developer/Applications/Performance Tools文件夹中。一旦您打开它,如果应用程序挂起,它会要求您输入密码并开始收集数据。一旦应用程序崩溃或恢复响应,您就可以查看它收集的报告。

检测到挂起

样本报告

您可以浏览报告并查看列出的调用,这些调用是程序正在执行的所有操作(缩进的项目是子调用)。列表中每个项目旁边的数字似乎表示该调用花费了多少时间,因此,如果您查看它们的名称(至少是可理解的名称),您可能能够收集一些有关花费这么长时间的信息。如果您发现某些不确定的内容,也可以具体询问。

而且,如果应用程序崩溃,如果您单击“报告”按钮,除了引发的错误之外,您还将获得类似的程序崩溃时所做操作的列表。如果您查看错误描述,并查看调用列表的末尾,您可能就能找出问题所在。

答案2

感谢您的回复,它们非常有帮助。jtbandes 帮助我解决了这个问题的第一步,但我想详细介绍其他部分,以便对其他人有所帮助。

我能够使用 Adium 以合理的可重现方式使问题发生。基本上,启动应用程序,打开对话,输入一些文本,然后右键单击一些文本。启动后第一次出现旋转器,持续一分钟以上。

于是我启动了 Spin Control,进入首选项,只针对 Adium,按照引发问题的程序操作。我能够获得该问题的文本报告,并发现问题正是我所期望的:

    5531 Thread_7203
  5531 0x30b9
    5531 0x3192
      5531 NSApplicationMain
        5531 -[NSApplication run]
          5531 -[NSApplication sendEvent:]
            5531 -[NSWindow sendEvent:]
              5531 -[NSTextView rightMouseDown:]
                5531 -[NSView rightMouseDown:]
                  5531 -[NSMenu _popUpMenuWithEvent:forView:]
                    5531 -[NSMenu _popUpContextMenu:withEvent:forView:]
                      5531 -[NSMenu _popUpContextMenu:withEvent:forView:withFont:]
                        5531 -[NSCarbonMenuImpl _popUpContextMenu:withEvent:forView:withFont:]
                          5531 _NSPopUpCarbonMenu1
                            5531 _NSPopUpCarbonMenu2
                              5531 _NSPopUpCarbonMenu3
                                5531 _ContextualMenuInsertItems
                                  5531 ContextualMenuInsertItems(MenuData*, unsigned short, AEDesc const*, ContextualMenuHelp const*, unsigned long*, OpaqueContextualMenuItemsRef**)
                                    5531 TContextualMenuPluginList::GetPlugins()
                                      5531 TContextualMenuPlugin::LoadContextualMenuPlugins(FSRef const&, __CFArray*)
                                        5531 TContextualMenuPlugin::LoadCMPluginsFromCFPlugin(FSRef const&, __CFArray*)
                                          5531 0x1d1ee0d6

因此看起来我确实遇到了插件问题,但缺乏相关详细信息。

因此我重新启动了 Adium,但这次我还打开了活动监视器并选择了该进程,并使用检查->打开文件和端口来监视应用程序具体在处理什么。当我重复生成问题的步骤时,我能够从列表中获取以下内容(请注意,打开的新文件/端口出现在列表末尾,因此通过查看列表末尾最容易找到问题):

/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Resources/English.lproj/Localized.rsrc
/Users/tim/Library/Contextual Menu Items
localhost:61506->localhost:26165

由此,我可以浏览本地上下文菜单项目录中的项目并确定导致问题的项目。

谢谢您的帮助。

答案3

嗯,可能是第三方扩展,也可能是内存不足或硬盘速度慢。这是什么类型的电脑?打开“系统偏好设置”。“其他”下有图标吗?打开 /Library/InputManagers。那里有文件吗?当应用程序挂起时,强制退出并单击“报告”。在此处发布日志。

相关内容