【问题标题】:app runs as debug, but crashes as release应用程序以调试方式运行,但在发布时崩溃
【发布时间】:2010-07-25 04:14:51
【问题描述】:

我有一个程序在调试配置中在设备上运行良好,但作为发布失败。有没有人有这种经历,我该如何解决?

谢谢

【问题讨论】:

  • 你应该看到我对这个问题的回答,它会(排序)给你你正在寻找的答案:stackoverflow.com/questions/3261557/…
  • 我看过了,但没有帮助。我提到的两个版本都在设备上运行,而不是在模拟器中。模拟器中的一切都很完美。
  • 我在这一点上得到:它们都是不同的,这就是它失败的原因。
  • 我希望得到更多的启发。我知道有时调试模式会自动清除分配变量,但非调试模式可能不会。只是说它不同是没有帮助的。我们都知道。 99 美元的问题有何不同?
  • @thyrgle -- 他在发布模式下的设备上失败,但在调试器上失败。您提供的链接正在讨论模拟器所需的仿真。这与这个问题无关。

标签: iphone cocoa-touch xcode


【解决方案1】:

我遇到了同样的问题 - 应用程序在调试模式下在模拟器和设备上运行良好,但在发布模式下都没有(它会安装,但只显示启动画面)

  • Xcode 4.3.2
  • iOS 部署目标 4.3

我一直在 StackOverflow 上看到答案说这是内存管理问题,但这对我来说没有任何意义,因为调试版本在加载到我的 iPhone 4S 时运行良好。我还检查了构建设置以了解这两种模式之间的不同之处,并且我跳过了最终重要的一个区别 - 编译器优化。

在 Build Settings -> Apple LLVM compiler 3.1 code generation -> Optimization Level 下,将 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 Documentation 有帮助,但没有解释为什么做相反的事情可以解决问题:

由于优化过程中涉及的额外工作,任何类型的代码优化都会导致构建时间变慢。如果您的代码正在更改,就像在开发周期中所做的那样,您不希望启用优化。但是,当您接近开发周期的尾声时,发布构建配置可以为您提供成品大小的指示,因此“最快、最小”选项是合适的。

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

最快,最小:编译器执行所有通常不会增加代码大小的优化。这是传送代码的首选选项,因为它可以让您的可执行文件占用更少的内存。

【讨论】:

  • 你引用的文档说Do not use this option [None] for shipping your executable。但那是你做的吗?
【解决方案2】:

发布

一些

线索!

“失败”是什么意思?碰撞?悬挂?抛弃内存使用?失败的症状是什么?有回溯吗?您的代码中是否有任何在调试与发布时表现不同的内容?任何#ifdef DEBUG 类型的恶作剧? asserts 有副作用吗?您是否弄乱了编译器设置?有 C++ 吗?组装?

我在 cmets 中看到了一丝线索;非法访问变量。这很可能是由于优化器在发布时重用堆栈槽的速度比调试快。这通常归结为过度发布问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2022-08-12
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2015-03-31
    • 2020-11-08
    相关资源
    最近更新 更多