状态:最近在Mac OS 10.8和Xcode 4.4上出现过这个问题。
简而言之:此问题可能会发生在两种情况下:在设备上运行和在模拟器上运行。在设备上运行时,断开并重新连接设备似乎可以解决问题。
Mike Ash建议
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
这种方法并非总是有效的。实际上,在我的情况下从未奏效过,但在某些情况下显然是有效的。只是不知道哪些情况下有效。因此值得一试。
否则,唯一已知的解决方法是重新启动用户的launchd。重新启动电脑可以做到这一点,但有一种不那么极端/快速的方法。您需要创建另一个管理员用户,但只需执行一次即可。当事情变得困难时,请注销您自己的账户,登录该用户的账户,并杀死属于您的主要用户的launchd,例如:
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
用你的主用户名替换user_id
。再次登录您的正常用户可以使您回到一个健全的状态。有点痛苦,但比完全重启要好。
详细信息:
在 Lion/Xcode 4.2 中,这种情况越来越频繁发生。(个人而言,在这个组合之前我从未见过。)
问题似乎出现在launchd中,当调试器停止调试应用程序进程而没有杀死它时,它将应用程序进程作为子进程继承。这通常通过应用程序成为僵尸进程(在ps中具有Z的进程状态)来表示。
核心问题似乎在于启动名服务器,它实现在 launchd 中。这(据我所知)将应用程序ID映射到Mach端口。当触发错误时,应用程序会死亡,但不会从引导服务器的名称服务器映射中清除,因此引导服务器拒绝允许在相同名称下注册另一个应用程序实例。
希望通过强制launchd等待僵尸进程来解决问题(请参见注释),但这并不能解决问题。僵尸状态并不是核心问题(这就是为什么一些僵尸进程是良性的原因),而引导名服务器才是问题所在,目前没有已知的方法可以清除这个问题,除了杀死launchd。
看起来这个错误是由 Xcode、gdb 和用户 launchd 之间的某些问题触发的。我刚刚重复了这个麻烦,通过在 iPhone 模拟器中运行一个应用程序,在 gdb 中停止它,然后构建和运行到 iPad 模拟器。它似乎对于切换模拟器(iOS 4.3/iOS 5, iPad/iPhone)很敏感。虽然不是每次都会发生,但当我频繁切换模拟器时,它经常发生。
在登录时杀死launchd将损坏您的会话。注销并重新登录不会杀死用户 launchd;OS X 会保留现有的进程。重新启动会解决问题,但这很痛苦。上面的说明速度更快。
我向Apple提交了一个错误报告。rdar://10330930
ps ax | grep SimulatorBridge
- Elland