状态:最近出现在 Mac OS 10.8 和 Xcode 4.4 中。
tl; dr:这可能发生在两种情况下:在设备上运行时和在模拟器上运行时。在设备上运行时,断开并重新连接设备似乎可以解决问题。
迈克·阿什建议
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
这并不总是有效。事实上,它从未对我有用,但在某些情况下它显然有效。就是不知道是什么情况。所以值得一试。
否则,解决此问题的唯一已知方法是重新启动用户启动。重新启动会做到这一点,但有一种不那么激烈/更快的方法。您需要创建另一个管理员用户,但您只需执行一次。当事情发生变化时,以您自己的身份注销,以该用户身份登录,然后杀死属于您的主要用户的 launchd,例如,
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
将您的主要用户名替换为user_id
. 以您的普通用户身份再次登录会让您恢复正常状态。有点痛苦,但不如完全重启。
细节:
Lion/Xcode 4.2 开始更频繁地发生这种情况。(就我个人而言,在那个组合之前我从未见过它。)
该错误似乎在launchd中,当调试器停止调试而不杀死它时,它继承了应用程序进程作为子进程。这通常由应用程序变为僵尸发出信号,进程状态为 Z in ps。
核心问题似乎出在在 launchd 中实现的引导名称服务器中。这(据我了解)将应用程序 ID 映射到马赫端口。当错误被触发时,应用程序会死掉,但不会从引导服务器的名称服务器映射中清除,因此引导服务器拒绝允许应用程序的另一个实例以相同的名称注册。
希望(请参阅评论)强制启动wait()
僵尸可以解决问题,但事实并非如此。核心问题不是僵尸状态(这就是为什么一些僵尸是良性的),而是引导名称服务器,并且没有已知的方法可以清除这个短于杀死 launchd 的问题。
看起来这个 bug 是由 Xcode、gdb 和用户 launchd 之间的错误触发的。我只是通过在 iphone 模拟器中运行一个应用程序来重复楔子,让它在 gdb 中停止,然后进行构建并运行到 ipad 模拟器。它似乎对切换模拟器很敏感(iOS 4.3/iOS 5、iPad/iPhone)。当我经常切换模拟器时,它不会一直发生,但相当频繁。
在您登录时杀死 launchd 会搞砸您的会话。注销并重新登录不会杀死用户launchd;OS X 保留现有的进程。重新启动会解决问题,但这很痛苦。上面的说明更快。
我已经向 Apple FWIW 提交了一个错误。rdar://10330930