如何调试macOS旧bug:Preview.app提示“应用程序已不再打开”鬼影进程问题
从多个 macOS 版本迭代开始,我遇到过不同应用出现鬼影进程的异常:这类进程仅在 Finder 和 Dock 层面可见,在基础 Unix 层级完全不存在。
尝试启动这类鬼影应用时,Finder 通常会弹出如下错误提示:
此时Activity Monitor(活动监视器)中没有任何Preview(预览)进程,使用 Unix 命令ps查询结果也是如此:
# ps ax | egrep '[ /](PID|Preview)' PID TT STAT TIME COMMAND #
同时 Dock 上该应用图标旁会显示运行中的小点,但无法强制退出这个鬼影应用。
已测试无效的解决方案
- Finder 中常用的
⌘+⌥+esc强制退出快捷键无法关闭该鬼影应用。 - 很多未经验证的教程建议删除偏好设置文件,但这类文件仅会被正在运行的应用打开,该建议只会浪费时间且丢失可用的偏好配置。杀掉 Finder 或 Dock 进程可行,但无法解决鬼影应用的显示异常问题。
- 无法通过 Finder 菜单
> Shut Down...( > 关机)正常关闭 macOS,因为 Finder 会将实际未运行的鬼影应用(此处为 Preview)判定为正在运行,无法结束其进程。 - 使用基础 Unix 命令可以干净快速地关机,因为 Unix 层级不存在无法杀掉的应用:
/usr/bin/sudo shutdown -h now 'Finder see ghost applications'
问题影响范围
根据我的经验,该问题存在于 Yosemite 和 High Sierra 版本中。如果你在更新版本的 macOS 上遇到过同样问题,欢迎在评论区告知。
已确认存在该问题的 macOS 版本:
- Yosemite
- El Capitan
- Sierra
- High Sierra
- Mojave
- Big Sur
已确认出现该问题的应用:
- Preview
- Safari
- TeamViewer
- XQuartz
根据我在不同讨论组看到的反馈,任意应用都可能出现被 Finder 和 Dock 识别为鬼影进程的情况。这是一个影响范围极广的问题,苹果官方尚未找到根因,也未提供合理的解决方案(仅给出重装 macOS 这种浪费时间的无效建议,在未明确问题根因时给出这类建议非常不合理)。
简易临时解决方案
被 Finder 识别为鬼影的应用本身及其偏好设置文件都不是问题根源。我们可以绕过 Finder 启动应用来验证这一点:
在Terminal(终端)中输入如下命令(以 Preview 为例):
$ open -n -a Preview.app $
即可启动一个全新的正常 Preview 进程,所有原有偏好设置和功能都可正常使用,Dock 中会新增一个该应用的图标。
问题分析
由于我没有找到该问题的合理解释和有效修复方案,我借助可追踪 Unix 进程所有关键事件的truss命令展开了自主调查。
首先我在一个终端窗口中运行:
$ /usr/bin/sudo dtruss -W Preview
同时在另一个终端窗口中尝试启动 Preview:
$ open -a Preview.app LSOpenURLsWithRole() failed for the application /Applications/Preview.app with error -600. $
但dtruss没有捕获到任何追踪记录,说明 Preview 根本没有启动,自然也没有打开任何偏好设置文件。
通过一个追踪所有事件的小程序,我确定弹出错误窗口的进程是CoreServicesUIAgent。但对该进程进行各类snoop后,我仍未找到它是基于哪个文件或内部数据库做出该进程存在的判定的。
lsappinfo(8)查询结果显示Preview仍在服务列表中注册,但对应的 PID 属于已经不存在的进程:
% lsappinfo info -app Preview [...] pid = 16898 !cgsConnection [...] [...] %
如何进一步排查这个广域bug
目前我对该问题的认知是:Finder 和 Dock 对系统中运行的进程存在错误的状态识别。
- 什么原因会导致系统进程状态被损坏?
- 哪些工具更适合进一步排查该bug?
- 在哪里可以找到
LSOpenURLsWithRole的相关文档及其错误码的含义?
内容的提问来源于stack exchange,提问作者athena

