8

突然间,我通过 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 构建)。

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

来自设备的控制台打印和崩溃日志:
- 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. 重新安装配置文件失败
2. 在我的机器上创建一个新用户并重新安装 Xcode。FAIL
3. 从另一台机器构建。FAIL
4. 将优化级别设置为:-O0 FAIL

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

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

4

1 回答 1

0

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

Crashed Thread:  1

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

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

于 2012-09-27T15:14:07.687 回答