我在模拟器上测试我的应用程序时,它在点击UIAlertView的一个按钮时崩溃了。我在那里停止调试,对代码做了一些更改,并重新构建应用程序。现在,当我运行应用程序时,我在控制台中得到这个错误

无法向引导服务器注册com.myApp.debug。Error:未知错误码。 这通常意味着该进程的另一个实例已经在运行或挂起在调试器中。程序接收信号:“SIGABRT”。

我尝试从模拟器中删除应用程序,做一个干净的构建,但当我尝试运行应用程序时,我仍然得到这个错误。

我应该怎么做才能再次在模拟器上运行应用程序?


当前回答

我有一个递归setter,它破坏了堆栈,杀死了我的应用程序,以至于我不得不启动我的iPad。这是可以通过修改代码来证明的。

其他回答

Mike Ash发布了一个不需要重启的解决方案(上帝保佑他!)运行:

launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove

上面的命令列出所有启动作业,搜索带有的作业 UIKitApplication的名字(这将是对应的作业 你的应用不恰当地停留),提取名称,和 告诉launchd把那份工作丢掉。

我也有同样的问题,并通过以下方法解决了它

从设备中删除应用程序, 断开设备与Mac的连接, 把设备关掉再打开, 退出Xcode重新上线, 戒烟工具, 最后,再次进行清洁和构建。

我还做了一件事,因为Xcode配置为使用iOS 5.0,而我的项目使用iOS 4.3

删除所有框架并重新添加它们。

我有一个递归setter,它破坏了堆栈,杀死了我的应用程序,以至于我不得不启动我的iPad。这是可以通过修改代码来证明的。

状态:这已经看到最近的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进程中,当调试器停止调试它而不杀死它时,它将应用程序进程作为子进程继承。这通常是应用程序变成僵尸的信号,在ps中进程状态为Z。

核心问题似乎是在launchd中实现的引导名称服务器。这(在我理解的范围内)将应用程序id映射到mach端口。当bug被触发时,应用程序会死亡,但不会从引导服务器的名称服务器映射中清除,因此,引导服务器拒绝允许该应用程序的另一个实例以相同的名称注册。

人们希望(见评论)强制launchd wait()等待僵尸程序来解决问题,但它并没有。这不是僵尸状态的核心问题(这就是为什么一些僵尸是良性的),但bootstrap名称服务器,没有已知的方法来清除这个杀死launchd。

看起来这个bug是由Xcode、gdb和用户launchd之间的一些不好的东西触发的。我只是在iphone模拟器中运行一个应用程序,让它在gdb中停止,然后执行一个构建并运行到ipad模拟器,从而重复了这个楔形操作。它似乎对切换模拟器(iOS 4.3/iOS 5, iPad/iPhone)很敏感。这种情况并不总是发生,但当我频繁切换模拟器时,这种情况就相当频繁了。

在你登录的时候杀死启动会搞砸你的会话。注销和重新登录不会终止用户启动;OS X保留了现有的进程。重启会解决问题,但这是痛苦的。上面的指令更快。

我已经向苹果提交了一个bug。rdar: / / 10330930

我遇到了@jyap提到的僵尸进程的问题。清除它们的唯一方法就是重启。然而,我注意到我的朋友在同一个项目中也会遇到同样的问题,但他们可以在不创建僵尸进程的情况下关闭模拟器。我完全卸载了Xcode并重新安装了它,虽然我仍然得到了错误,但它没有创建僵尸进程,所以我不必重新启动。

在此之前,我使用了这个非常丑陋的解决方案:更改应用程序ID并再次运行。你最终会在模拟器中看到应用程序的垃圾副本,但你可以推迟一段时间重新启动。