应用程序在调试模式下运行正常,但在发布模式下崩溃。

6

我有一个程序,在Debug配置下在设备上运行良好,但在Release版本下失败。有没有人有这种经验,如何解决?

谢谢


我已经看过了,但是没有帮助。我提到的两个版本都在设备上运行,而不是在模拟器中。在模拟器中一切都完美无缺。 - John Smith
我现在的理解是:它们是不同的,这就是为什么它失败的原因。 - thyrgle
我希望得到更多的启示。我知道有时候调试模式会自动清除变量,例如在分配时,但非调试模式可能不会。仅仅说它不同并没有帮助。我们都知道这一点。关键是它在哪里不同,这才是最重要的问题。 - John Smith
@thyrgle -- 他在发布模式下失败了,但在调试器中没有。你提供的链接是关于模拟器所需的仿真,与这个问题无关。 - TechZen
启动时崩溃?在特定位置崩溃?您仍然无法从设备中提取和符号化崩溃日志吗? - Nick
显示剩余5条评论
2个回答

16

我也遇到了同样的问题 - 应用程序在模拟器和Debug模式下运行良好,但在Release模式下无法正常工作(可以安装,但只显示启动画面)

  • Xcode 4.3.2
  • iOS部署目标4.3

我一直在StackOverflow上看到说这是内存管理问题的答案,但对我来说这毫无意义,因为调试版本在我的iPhone 4S上加载时完全正常。我还检查了Build Settings以查看两种模式之间的区别,并跳过了最后有影响的一个差异 - 编译器优化。

在Build Settings中-> Apple LLVM编译器3.1代码生成 -> 优化级别下,将Release设置从默认值 Fastest,Smallest [-Os] 更改为 None[-O0] 。解决了我的问题。

在这篇博客文章中找到了这个解决方案: http://www.mindjuice.net/2011/11/30/how-to-fix-an-app-that-crashes-in-release-but-not-debug/

虽然 Apple文档有所帮助,但并没有解释为什么做相反的事情会修复问题:

任何类型的代码优化都会导致更慢的构建时间,因为涉及到优化过程中的额外工作。如果您的代码在开发周期内正在变化,那么您不希望启用优化。当您接近开发周期的结束时,发布构建配置可以为您提供完成产品的大小指示,因此最快,最小选项是适当的。

None:编译器不尝试优化代码。在开发期间专注于解决逻辑错误并需要快速编译时,请使用此选项。不要将此选项用于发布可执行文件。

最快、最小:编译器执行所有不会增加代码大小的优化。这是发布代码的首选选项,因为它可以使可执行文件的内存占用更小。


你引用的文档说“不要使用此选项[None]来发布你的可执行文件”。但这是你所做的吗? - Adam Johns

1

发布

一些

线索!

"失败"是什么意思?崩溃?挂起?因内存使用而被抛弃?故障的症状是什么?有回溯吗?您的代码中是否有任何在调试和发布版本中表现不同的行为?有任何类似于#ifdef DEBUG的花招吗?带有副作用的asserts?您是否更改了编译器设置?有C++?汇编语言吗?

我在评论中看到了一点线索;变量的非法访问。很可能,这是由于优化器在发布版本中比调试版本更快地重新使用堆栈插槽引起的。通常,这归结为过度释放问题。

即使在发布版本中构建,您仍然可以打开僵尸检测。

此外,您是否执行了构建和分析并修复了它指出的任何问题?


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