GSRegisterPurpleNamedPort SIGABRT 在 UIApplicationMain 在应用程序委托开始运行任何代码之前

Posted

技术标签:

【中文标题】GSRegisterPurpleNamedPort SIGABRT 在 UIApplicationMain 在应用程序委托开始运行任何代码之前【英文标题】:GSRegisterPurpleNamedPort SIGABRT in UIApplicationMain Before App Delegate Gets to Run Any Code 【发布时间】:2011-04-05 02:45:26 【问题描述】:

我们最近对我们的一款应用进行了更新,许多用户告诉我们他们无法再运行该应用,因为它在启动时崩溃了。

我们已经能够通过在设备上构建和运行以前的版本构建,然后在同一设备上构建和运行新的构建来重新创建崩溃,但是这次崩溃的堆栈跟踪非常奇怪:

Thread 0 Crashed:
0   libSystem.B.dylib             0x000791d0 __kill + 8
1   libSystem.B.dylib             0x000791c0 kill + 4
2   libSystem.B.dylib             0x000791b2 raise + 10
3   libSystem.B.dylib             0x0008d6fa abort + 50
4   GraphicsServices              0x00003aa8 GSRegisterPurpleNamedPort + 172
5   GraphicsServices              0x00003d5a GSEventInitialize + 150
6   UIKit                         0x00004cd6 UIApplicationMain + 350
7   MyApp                         0x0000df5c main (main.m:14)
8   MyApp                         0x00002c84 start + 32

它似乎在 main 调用的 UIApplicationMain 方法中崩溃。但是它在到达我们的应用程序委托中的任何方法之前就崩溃了。我在所有应用程序委托方法中都设置了断点,但都没有到达。

此外,这似乎只发生在更新应用的用户身上。从应用商店下载它但尚未在其 iPhone 上的用户没有发现问题。

有没有人遇到过这样的崩溃?为什么只有更新才会出现这个问题?

【问题讨论】:

FWIW:我的升级没有任何问题。我在 ios4 (3GS) 上,我更新了应用程序。 嘿 Derek,您是否找到了此问题的根本原因?我正在处理类似的事情,我正在努力寻找解决方案。 现在(2013 年 6 月 4 日)在 iOS 6.1 上看到同样的问题 这里也一样,对我来说,它是在我安装 OS X 10.8.4 更新后开始的。现在,当我尝试调试时,我通常需要启动两次才能成功。 【参考方案1】:

这是在 iOS 4.0 下吗?当此应用程序的先前安装中的进程或线程崩溃并且不知何故尚未被操作系统清理或已挂在调试器中时,会报告此类错误。

安装新版本应用程序后重新启动 iPhone 是否会导致此错误消失?这将是一个很好的迹象,表明之前安装的操作系统中存在某些问题,而不是应用程序包本身。

【讨论】:

是的,这似乎发生在 iOS 4.0.x 下。该应用程序不太可能崩溃并且没有在这么多设备上进行清理,但它可能在更新发生时在许多设备上处于待机模式的后台。重新启动我的开发设备后,我无法再使用我描述的方法重现问题。我想知道是否有什么我可以为我们的用户解决问题的方法。我宁愿不要求他们重新启动手机和/或删除它并重新安装它。 如果在安装新版本应用程序之前或之后重置设备可以解决问题,问题可能是您之前的应用程序版本没有正确退出后台/挂起模式;修复可能导致的任何严重内核锁定显然为时已晚。您可能希望在操作系统错误报告中将您应用的旧版本提交给 Apple。 也为我工作。谢谢你的回答——我完全被难住了。 重启设备有效,但有人知道 Apple 是否修复/将在某个时候修复此问题吗?我在 iOS 4.3.3 和 4.3.5 上仍然发生这种情况。 iOS 6.1 上仍然存在【参考方案2】:

我也遇到过同样的问题(幸好我在提交到 AppStore 之前发现了它)。与answer 状态不同,iOS 5.x 和 6.x 上仍然存在此问题。

所以我进入控制台,发现在我的应用程序崩溃之前记录了一些消息。首先是这条消息:

com.apple.launchd.peruser.503[148]: (UIKitApplication:BUNDLE-ID[0x4fb5][20462]) 以下作业试图从该作业中劫持服务“BUNDLE-ID-1”:UIKitApplication: BUNDLE-ID-1[0xac31]

随后会立即显示控制台中的下一条消息:

GSRegisterPurpleNamedPort 无法向引导服务器注册 BUNDLE ID。错误:未知错误代码 (1100)。 这通常意味着 此进程的另一个实例已在运行或已挂起在调试器中。

崩溃是由系统上已经运行的另一个几乎相同的进程引起的。这听起来像是 iOS 的问题,而不是应用程序本身的问题。这应该有助于解决问题。最好的办法可能是告诉用户退出应用程序,尝试重新启动并再次打开。

我还向 Apple 提交了一份错误报告,详细说明了该问题。

编辑:看起来这可能是 Xcode 本身的问题。 Apple 刚刚发布了一个更新,应该可以解决这个问题(至少在模拟器中):

【讨论】:

【参考方案3】:

我在一个项目中遇到这个问题每次我第二次调试它。只有重新启动设备才能让我再次调试。

最终通过重新安装 iTunes 解决了上述堆栈跟踪的特殊原因。

【讨论】:

【参考方案4】:

这可能是纯粹的共同事件,但是当我调试应用程序发布模式时,而不是再次删除它尝试在调试模式下调试它,这个问题似乎发生了。然而,重新启动它就可以了。

【讨论】:

【参考方案5】:

似乎旧应用程序已经启动而没有完全退出,一些处理程序仍然存在或被操作系统注册,所以当您启动新版本时,应用程序崩溃。

我也遇到过这么棘手的问题,请问最后怎么解决的?谢谢。

【讨论】:

【参考方案6】:

这里没有核心数据。刚刚更新了主包中的一个文本文件,突然之间 “紫点”失败。 IOS 5.1.1、iPad、opengl 应用程序,有很多手势接口。 我真的很高兴在这里找到一些线索。重置修复了它。

【讨论】:

【参考方案7】:

更新到 10.8.4 时似乎也发生了这种情况,我猜是 Xcode 的错误,我会发布错误报告。如果打开应用程序并从 Xcode 运行它,应用程序会崩溃,有时它会自行重新启动,有时我需要重新启动它。

【讨论】:

【参考方案8】:

如果您在应用程序中使用 Core Data 并更改了架构,那么您经常会看到出现此问题。发生的情况是旧版本的应用程序将具有旧版本的数据库(大概是 sqlite),并且当新版本的应用程序启动时,它也需要新版本的数据库。这会导致像这样在启动时崩溃。

立即解决此问题的方法是删除该应用并重新安装。我们在开发过程中这样做。但是当你准备好推送新版本时,你需要设置一个映射模型来迁移你的数据库。开发者文档中有很多关于数据迁移的信息:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreDataVersioning/Introduction/Introduction.html

【讨论】:

在应用程序生命周期的早期没有加载核心数据模型,因此似乎极不可能是罪魁祸首。

以上是关于GSRegisterPurpleNamedPort SIGABRT 在 UIApplicationMain 在应用程序委托开始运行任何代码之前的主要内容,如果未能解决你的问题,请参考以下文章