使用临时分发的设备崩溃

Posted

技术标签:

【中文标题】使用临时分发的设备崩溃【英文标题】:Crash on device using ad-hoc distribution 【发布时间】:2012-09-16 20:10:18 【问题描述】:

突然间,我通过 Testflight 和 iTunes-sync 进行的临时分发不再起作用。使用 ad-hoc 构建配置分发的应用程序永远不会在设备上完全启动。它立即崩溃并出现分段错误 11。

这个问题的奇怪之处在于,调试版本在下面提到的所有设备上都能完美运行。这让我相信我的project.pbxproj 有问题。但是当我查看 git-log 时,我没有发现任何异常,唯一改变的是架构 (ARCHS) 和有效架构 (VALID_ARCHS) .

我是否正确地假设搞乱架构不应该在启动时而是在构建过程中导致实际错误?

一些背景: 另外值得一提的是,我同时安装了 Xcode 4.4.1 和 4.5 GM,当我将 GM 升级到 App Store 中的那个时,它也删除了我对 Xcode 4.4.1 的备份。在那次打嗝之后,我删除了所有版本的 Xcode,重新启动并再次安装了 4.4.1 版(这样我就可以为 armv6 构建)。

任何有关如何进行此调试的有用提示对我来说都非常有价值。 谢谢你的时间。

来自设备的控制台打印和崩溃日志: - https://gist.github.com/3781018 如果需要,我可以添加更多日志。

当前环境: - Xcode 版本 4.4.1 (4F1003) - Mac OS 版本 10.8.2

项目设置 (pbxproj): - https://gist.github.com/3780985

测试的设备: - iPhone 3GS ios 6 - iPhone 3G iOS 4.2.1 - iPad 第二代 iOS 5.1.1 - iPhone 4S iOS 5.1.1 - iPhone 4 iOS 6.0 - iPhone 4S iOS 6.0

更新 为了继续调试,这是我尝试过的: 1. 跳过 Testflight 并使用老式的方式通过 iTunes 发布 ad-hoc。 失败 2. 重新安装配置文件FAIL 2. 在我的机器上创建一个新用户并重新安装 Xcode。 失败 3. 从另一台机器构建。 失败 4.设置优化级别为:-O0 FAIL

尽管我确定没有更改任何代码,但我没有看到其他合理的解释。所以我开始在 git 中恢复项目,盯着我成功发布临时版本的那一天。令我惊恐的是,我注意到同样的分段错误正在跟随我穿越时间的结构! 考虑到这一事实,只剩下一个行动可以采取了;我称之为spray-and-pray的一种非常强大的调试方式。 =) 换句话说,我开始注释掉代码的一部分,看看这是否有任何区别,令我完全惊讶的是,它确实做到了。在禁用和启用我的应用程序的几个小时后,我发现了罪魁祸首:一个静态的 NSArray 从未被保留。真正让我大吃一惊的是,自 2010 年以来,数组的实际初始化看起来一直是一样的。那么,到底为什么这会突然导致内存错误呢?为什么静态分析器没有警告我们呢?

我现在太累了,无法立即回答这些问题,我会尝试用更多细节更新问题,希望明天也能得到答案。 再次,非常感谢到目前为止提供帮助的任何人!

【问题讨论】:

编译器优化有时很奇怪,典型的调试版本会摆脱优化。尝试运行使用 -O0 构建的发布版本? 感谢您的提示,但这并没有起到任何作用。和以前一样的崩溃。 :// 可能不是您的问题,但是当我遇到签名问题时,我的症状完全相同。我不得不处理我的证书和配置文件。还要确保您没有错误地为应用商店签名。 感谢瑞恩的提示,但我已经检查过,双重检查和三次检查。它与签名过程无关,因为我可以加载一个虚拟视图而不是我的整个视图层次结构并创建一个正常运行的构建。 出于好奇我可以问一下 CompanyXTabBarController.m:62 是什么线吗? 【参考方案1】:

看起来问题的原因是并发问题:

Crashed Thread:  1

在这种情况下,可能很难找到并解决问题的根源 (http://en.wikipedia.org/wiki/Unusual_software_bug#Heisenbug)。

可能是您在没有正确同步的情况下对来自多个线程的一个对象做某事; 或者可能是您在一个线程(例如线程 0)中释放对象并尝试从另一个线程(线程 1)访问它。

【讨论】:

以上是关于使用临时分发的设备崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从设备上的命令行安装并启动 ipa 签名以进行临时分发

应用程序的临时分发和撤销访问权限

在临时分发中加载自定义框架时出错

无法使用 iTunes 11.0.1 安装临时分发

设备和模拟器上的调试工作时,临时 iPhone SIGSEGV 崩溃

仅针对临时构建和旧设备保存时核心数据崩溃