2010-03-30 196 views
1

我正在使用的一个项目在使用发布配置构建时崩溃。iPhone发布版本崩溃

我们需要将应用程序发送给苹果进行审查,甚至在进入应用程序之前它都会崩溃。

任何想法如何发生?

在上次重新调整时,是否可以通过一些优化向苹果发送调试版本的应用程序?

谢谢。

+0

您是否尝试过使用Xcode调试器执行应用程序? – 2010-03-30 13:28:52

+0

我无法调试该应用的发布版本。 有没有办法? – clide313 2010-03-30 13:38:25

回答

1

构建我的第一个iPhone应用程序时发生同样的事情 - 在从调试切换到释放应用程序之后,一段时间处理该项目一段时间后会崩溃。我做了一个完整的重建项目,从测试手机中删除了应用程序并重新安装了它,然后应用程序运行。它看起来像XCode有时不清理/重建所需的一切。

+0

感谢您的建议,也会尝试一个,希望这会像您解释的那样简单。 – clide313 2010-03-30 13:41:58

+0

这可能是对的,但如果底层原因是内存泄漏或其他与内存/指针有关的问题,也可能是红色鲱鱼,因为在清理之后,内存中的内容会稍微不同。 – 2010-03-30 13:48:57

+0

感谢您的帮助。 使它工作起来要困难得多,但现在它正在工作。 我做了很多事情,我不知道什么解决方案很实用。 但因为我没有更改任何代码行,所以我将您的解决方案标记为已接受。 – clide313 2010-04-02 15:12:07

0

如果使用发布配置进行构建,请确保保留.dSYM文件和应用程序包的副本。

然后当应用程序在设备上崩溃时,将其插入Xcode并下载崩溃报告。

打开Xcode,然后从Xcode中打开管理器。从那里你可以查看设备的崩溃报告。

当且仅当您保存.dSYM文件和应用程序包时,崩溃报告将被符号化。

然后,您可以使用崩溃报告查明崩溃原因并进行修复。

0

你应该看看你的崩溃日志。打开管理器,选择您的设备,然后选择“崩溃日志”选项卡。向下滚动查找您的应用程序的日志。应该是符号化的,所以你可以看到堆栈跟踪。

没有真正调试你的应用程序,真的很难说更多。你使用#ifdef DEBUG宏吗?你使用多个线程?如果你有一堆NSLog语句会在调试模式下减慢执行速度,这可能会引入微妙的时间差异,从而影响多线程应用程序。

您是否在您的调试版本上尝试了'make clean'?当您的项目部分重建而其他部分未更改时,隐藏的错误可能会隐藏。

+0

将查看崩溃日志。 我没有在任何地方使用#ifdef,是的,我有一个多线程程序(但我确信任何数据修改是在主线程中进行的),线程不直接通信。 – clide313 2010-03-30 13:41:02

+0

这将走很长的路。请谨慎阅读来自辅助线程的数据。即使你使用的是NSLock,或者只从主线程写入数据,也不要在从辅助线程读取时做出假设。例如,在使用它之前检查你需要的对象实际上是否存在。主线程在您的辅助线程访问它时可能已经释放它。这些类型的时序错误可以避免在较慢的调试代码中检测到,但是在释放代码中却会让他们看起来丑陋。 克里斯关于下面使用静态分析的建议也是合理的建议。 – Zack 2010-03-30 13:55:48

1

根据我的经验,10个令人讨厌的事情中有9次,很难追查任何事情的非调试与调试版本中的崩溃,iPhone或其他,都是由内存管理错误引起的。我会为您的问题投入资金,这是由于发布或保留信息不当或缺少信息而造成的。如果您还没有尝试过,请在您的调试版本配置中打开静态分析器(我的XCode现在正在更新,但我相信如果您在构建属性中搜索“分析器”或“铿锵声”,应该找到合适的设置),看它是否指向任何可以说明的事情。如果没有,您可以使用仪器来帮助您检查问题,并尝试隔离调试器中的问题区域。

它可以帮助您通过修改您的调试配置或复制它来使用一组不同的编译器标志,以更紧密地与发布版本中发生的情况对齐,从而在非实际发布版本中重现问题(我不记得有什么不同之处,但我会假设在你的编译器标志中添加一个“-O2”会让你获得最大的效果)。