排查Mac中的Finder无限卡住的问题

某个周末,Mac突然抽风。Finder卡住,鼠标变成了风火轮一直在转。除了Finder以外的其它程序可以打开勉强使用,但那些程序打开没多久也会卡住。用活动监视器也无法让Finder强制退出;用命令行killall杀掉Finder进程也没用,它马上就会重启然后继续卡住。重启系统也没用。于是Finder就一直这样处于未响应状态,进而导致整个系统卡死:


在网上发现不少人遇到这个现象,但是原因和解决方案五花八门。有不少人是因为安装了某个第三方软件导致,但他们所列举的软件在我机器上都没安装。后来意外发现,新建一个别的账号并登录到那个账号中,问题就会消失。于是当时就删除了老账号,用新账号工作,自以为解决了这个问题。

但才过一星期,新账号上也出现了这个问题,而且是在上班时间,严重影响了我的工作。于是我决定认真排查下这个问题的起因。

我再次新建了一个别的账号。在那个账号中,问题按照预想消失了,所以问题原因肯定和账户范围内的设置和数据有关,而不是系统全局性质的。因此首先考虑删除用户目录下的一些可疑的数据缓存和配置文件。上周出问题的时候我曾按照网上一些文章所说的删掉了~/Library/Preferences/com.apple.finder.plist,但没有效果。

有一篇技术博客提到了两个目录:~/Library/Caches和~/Library/Saved Application State。其中Saved Application State保存着上次退出系统时各个应用程序的状态,这其中就包括Finder的状态。但我把两个目录都清空了,依然无用。

继续在网上搜索,了解到Mac有安全模式

重启进入安全模式,问题竟然消失了!但回到正常模式后,问题又出现。因此可以推测是正常模式下Finder或系统加载了某些模块导致卡死,而安全模式下因为没有加载那些模块,所以运行正常。

根据苹果官方文档的提示,首先怀疑是否有不兼容的登录项。

于是进入 系统偏好设置 -> 用户与群组 -> 登录项,将所有登录项全部删除:

然而还是没用,问题依旧。看来要以更加技术的手段来分析这个问题。

上文提到的技术博客写到通过活动监视器查看Finder引用的所有模块和文件。这是个不错的思路。

于是我打算按照这个思路进一步深究,看看有哪些文件是Finder在正常模式下会加载,但安全模式下不会加载的。

先以正常模式启动系统,进入卡住的状态。趁Finder卡住但活动监视器还未卡住的时候,在活动监视器中选中Finder,然后点击监视器界面左上角的感叹号图标:

在弹出的窗口中点击“打开的文件和端口”,就能查看某个正在运行的程序所引用的模块。

如果活动监视器也不幸卡住,可以右键单击Docker上的活动监视器图标让其强制退出,然后再次点击启动它——还好我平常就将活动监视器驻留在了Docker上。

由于系统卡顿的状态下截图困难,所以我用手机将Finder引用的模块拍了下来。接着重启Mac进入安全模式,以同样的步骤记下Finder在安全模式下引用的模块。一个个比对过去, 我发现在正常模式下加载但安全模式下不加载的模块并不多,而这类模块中包含了SIMBL和AFloat,这是最可疑的两个模块:

我在安全模式下,在mySIMBL中卸载了AFloat。这次再启动到正常模式,问题果然没有再出现!后来我把AFloat再次开启,问题就又出现了。看来我遇到的Finder卡住的问题就是AFloat的缘故。

从网上看,并不只我一个人遇到过Afloat导致的Finder卡住问题:https://github.com/millenomi/afloat/issues/20

其实我的Mac升级到Sierra后重装AFloat已经有几个月了,为何最近才出现Finder卡顿的问题,原因仍未知。而且从事后看,AFloat安装后是对所有账号都生效的,为何在刚刚新建的账号中问题又消失了呢?这里更具体的原因仍然未清楚,但目前我不打算深究了。

这里忍不住要吐槽Mac。引用上文提到的技术博客中的话:“这一点上,我想说它连Windows都不如,Windows 不响应了可以结束进程,重新打开后就OK了,它却进入了无限未响应的循环。”而且一个系统中最常用的软件竟然会被一个第三方插件卡住主线程,这样的设计挺糟糕的。

最后还是对此次故障排查的思路做个小结:

  1. 毫无疑问,求助搜索引擎。
  2. 更换账号(最好新建一个),看问题是系统全局范围的还是局限在账号范围内。如果问题局限在账号范围内,那么可以怀疑账号的缓存和配置文件。
  3. 重启Mac进入安全模式,看问题是否会消失。如果问题在安全模式下消失,则问题可能出在账号登录项,或是问题程序在安全模式下不会加载的模块中。
  4. 通过活动监视器检查问题程序所引用的模块。比对系统在正常模式和安全模式下程序所加载的模块,找出可疑对象。顺便提下,将活动监视器驻留在Dock上有助于在系统卡顿难以操作时以最快速度调出活动监视器以排查问题。
本文在我的独立博客上的地址:http://zxtechart.com/2017/05/10/mac-finder-stuck/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章