在iOS模拟器上测试时出现错误:无法与引导服务器注册

372

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

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

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

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


2
在设备测试时出现这种情况,有什么建议吗?我已经尝试过重新启动设备和Xcode。 - iPadDeveloper2011
1
我也尝试删除设备上的应用程序,退出所有活动应用程序(双击主屏幕键,在应用程序图标上按住手指,触摸“-”符号),重新启动Xcode,注销并再次登录。到目前为止还没有任何作用。 - iPadDeveloper2011
尝试在XCode菜单中选择“清空缓存”。这也有帮助作用。 - lostInTransit
活动监视器中的流程是什么? - user844079
3
对于遇到这个问题的每个人,后来发现,这通常是由于代码中的错误导致的。查找一些需要很长时间执行或使应用程序进入循环的代码片段。 - lostInTransit
4
当发生这种情况时,我只需杀死SimulatorBridge并退出模拟器。ps ax | grep SimulatorBridge - Elland
31个回答

244

状态:最近在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


2
感谢对新版Lion/XCode4.2行为的详细解释。在调试两个不同的应用程序时,这种情况似乎更加频繁发生。 - samkass
2
不仅仅是Lion。我还在使用Snow Leopard,在升级到XCode 4.2之后经常看到这个错误。(之前一直使用XCode 3.x,直到发布iOS SDK 5.0为止。) - Jonny
3
谢谢提供信息…这种情况最近发生得非常频繁…在过去的10分钟内发生了两次。每次都需要重新启动电脑,导致很难保持高效的工作流程。好的,我要再次重启电脑了。 - Brad G
1
@smparkes: 实际上,这种情况似乎比以前更频繁发生。我只需更改bundleID,一切就能正常运行,但在尝试调试CoreData逻辑时会很烦人。不过比重启机器还是要好一些,我要承认。 - Mike A
2
4.3.1,刚刚发生了...太烦人了。对我来说,重新启动iPhone通常可以解决问题,我不需要重新启动我的Mac。这个问题在Snow Leopard下的XCode 4.2中开始出现,大约是在2011年9月左右。 - TheEye
显示剩余23条评论

162

尝试退出并重新启动模拟器? 如果最坏的情况发生了,您可以尝试重新启动:根据我的经验,这应该会解决问题。


45
最终重新启动了系统!但仍然不知道导致问题的原因! - lostInTransit
6
如下评论所述,通常可以在“活动监视器”中看到挂起的进程并在那里终止它。 - mxcl
14
我讨厌重新启动 :) 退出卡住的进程对我有帮助:使用 ps ax | grep 模拟器 命令可以显示正在运行的应用程序,在我的情况下,卡住的是 MyApp.app。 - BadPirate
10
我经常在XCode 4.3中遇到这个问题。重新启动应用程序或退出模拟器都不能解决问题。我必须重启电脑才能使其正常工作。 - Øystein
4
如果您在设备上以调试模式运行时遇到此问题,您需要重新启动设备。 - wkhatch
显示剩余8条评论

70

我发现在Lion(Mac OS X 10.7)+ Xcode 4.2中出现了这个问题。我也在Xcode 4.3中遇到了这个问题。

我已经尝试了所有建议,但除了完全重新启动之外,没有任何建议可行。

以下是如何快速确定您是否需要重新启动:

列出所有僵尸进程:

ps -el | grep 'Z'
如果你在进程列表中看到你的应用程序被标记为僵尸进程,那么你需要重启你的机器。错误消息会提示:“这通常意味着该进程的另一个实例已经在运行,或者被卡在了调试器中”。Xcode检测到了这个僵尸进程,你无法结束它。唯一的解决方法就是重新启动系统。 :(
编辑:20120823:我现在对僵尸进程有更好的了解,所以我想更新一下这个答案。当父进程没有调用wait()(等待进程状态改变)来终止子进程时,就会创建出一个僵尸进程。你无法直接使用“kill”命令杀死僵尸进程,但如果你杀死父进程,那么僵尸子进程将会被“收割”并从进程表中删除。
我很久没有遇到过这个问题了,所以我没有查看在这种情况下的父进程是什么。除了杀死父进程外,另一种解决方法就是重新启动系统。 :)

1
重新启动是足够的,但并非必要,如上所述。此外,有时周围会有不会引起问题的僵尸进程,因此通过这种方式寻找僵尸进程并不是一种可靠的方法。唯一确定的迹象是在Xcode中的消息。 - smparkes
你尝试过以root身份杀掉这些僵尸进程吗?在我想到这样做之前,我已经重新启动了。 - Ryan H.
1
@smparkes,是的,根据讨论此错误消息的问题,这是显而易见的。 - jyap
1
@HZC,是的,即使作为root用户也无法杀死僵尸进程。 - jyap
我已经随机修复了模拟器,具体方法如下:使用命令“ps -el | grep 'Z'”查找僵尸进程的父进程PID,然后使用命令“kill -3 PID”杀死该进程,最后退出并重新登录。现在模拟器可以正常工作了。 - snez
显示剩余4条评论

20

我刚刚遇到了这个问题:我在我的设备上得到了这个错误,但模拟器却可以正常工作。最终,我不得不重置我的设备,错误消失了。


1
同样的问题,重启设备之后就好了。模拟器运行正常。 - agente_secreto

15

最近我经常遇到这个问题。有什么方法可以防止出现这个问题吗?注销并重新登录可以解决问题,但是...每隔一段时间这样做很烦人。

编辑:

我刚刚发现原因了。我的ApplicationWillTerminate方法中有一个bug。所以当我在Xcode窗口上单击停止按钮时,应用程序无法正常终止并开始挂起。

检查Activity Monitor,看看您的应用程序是否在列表中。如果可能,强制退出。


2
这对我有用!ps aux | grep Simulator - Jason Prado
如果有帮助的话,我是在启动泄漏性能工具时创建了这个错误。 - IssamTP

14
如果您发现问题是由僵尸进程引起的:
ps -el | grep 'Z'
(就像早先的评论中所述https://dev59.com/DnRA5IYBdhLWcg3w6SNH#8104400),并且只想立即解决问题,您可以在不重启或杀死任何进程的情况下完成。 只需将项目目标可执行文件重新命名即可:
  1. 单击左侧面板上的项目
  2. 在中间面板中选择构建设置
  3. 在“打包”下,将产品名称 $ (TARGET_NAME)更改为$ (TARGET_NAME).1

容易!


这对我没有起作用,出现了相同的错误:预配配置文件“mataleao2”指定的应用程序标识符为“au.com.mataleao”,与当前设置“au.com.mataleao-1”不匹配。 - sapatos
你是在模拟器上测试还是在iPhone上测试? - JRG
我只在 iPhone 上进行测试,我正在测试的功能只能在手机上运行。 - sapatos

7

好的,虽然没有答案,但至少还有一个测试可以进行。打开终端并运行此命令:“ps-Ael | grep Z”。如果您得到两个条目,一个是“(clang)”另一个是您的应用程序或公司名称,那么您就遇到了麻烦 - 需要重新启动。

如果您是开发人员,请输入一个简短的错误,并告诉苹果公司必须重新启动非常恼人,并提到他们可以将此错误重复到“rdar://10401934”,我刚刚输入。

大卫


5

对我来说,重置iOS模拟器解决了这个错误。虽然这将删除您在模拟器中拥有的所有应用程序,但它可以在无需重新启动计算机的情况下解决问题。

您可以通过以下步骤重置iOS模拟器:

1)转到主屏幕最左侧的苹果()标志旁边的“iOS模拟器”菜单。
2)选择“重置内容和设置...”。
3)阅读弹出消息,如果同意,请单击“重置”,否则单击“不重置”。


3
完全没帮助,反而会失去所有的内容、应用、照片和联系人。 - strange
1
@strange 是模拟器。无论如何,它不包含任何重要信息。 :) - Evgen Bodunov

5
  1. 关闭模拟器
  2. 停止在xCode中运行的应用程序。
  3. 打开活动监视器,搜索正在运行的具有您应用程序名称进程
  4. 在活动监视器中终止此进程
  5. 重新构建您的项目,然后您就可以开始了

该进程似乎免疫于在活动监视器中被“强制退出”终止。 - Ferruccio

4

重启设备,解决了问题!:D

感谢大家提供的好建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接