【问题标题】:iOS crash only when NOT running via XCode. Concidence?仅当不通过 XCode 运行时 iOS 才会崩溃。巧合?
【发布时间】:2012-04-13 10:59:07
【问题描述】:

我的应用程序只有在不使用 XCode 调试器运行时才会崩溃。很难跟踪,因为我无法调试,但我终于弄明白了。这是因为在某些不属于我的对象上调用释放。在我更正之前,我在这里搜索并找到了 2 个相关问题(链接如下)

iOS App Crashes when running by itself on device, does not crash when running through Xcode using debugger, or in simulator

iPhone crash only when device not connected to xcode, how to understand the crash log?

上述问题都没有回答为什么通过调试器运行时没有崩溃。所以我的问题是为什么会发生这种情况?我知道调试/发布特定崩溃的原因,但这太疯狂了。是不是偶然发生了10多次。

【问题讨论】:

  • 您是否尝试过启用 Zombies 的分析?
  • 不,但我通过查看我正在向僵尸对象发送释放消息的 dealloc 方法弄清楚了。

标签: ios xcode debugging crash


【解决方案1】:

您所描述的并非典型的与内存相关的错误。在这种情况下,您可能还想使用 debug-malloc。虽然这不能保证找到一切。原因(只要有源代码级调试器就一直在发生这种情况)是在可调试代码中以及在调试器下运行时内存的布局至少有所不同。因此,该错误会导致在调试器下(无害地)损坏另一块内存。当不在调试器下时,损坏的位置实际上是您的代码关心的东西,它会崩溃。

反过来也可能发生同样的情况,但你永远不会知道 - 如果它在运行可调试时崩溃,你会在切换到在调试环境之外运行之前发现它。

【讨论】:

    【解决方案2】:

    重申@jyoung的答案,因为我第一次浏览时没有看到它:

    尝试在关闭僵尸对象的情况下运行。

    在调试模式下,如果你打开它,它会以不同的方式处理内存分配。尝试不运行它。

    转到编辑方案...> 运行 > 诊断。然后确保关闭了僵尸对象:

    然后再次运行您的代码路径。

    【讨论】:

      【解决方案3】:

      我也遇到了这个问题,很幸运能够迅速找出原因,希望通过在这里发帖我可以为其他人节省一些浪费的时间。澄清一下,我的应用程序在直接从 XCode 启动时可以正常运行,但在 iPad 上手动启动时会立即崩溃。

      有问题的应用程序是用 Obj-C 编写的,但依赖于一些用 Swift 编写的第三方代码。 Swift 代码作为嵌入式框架包含在应用程序中。我必须在应用程序的构建设置中(在构建选项下)将“嵌入的内容包含 Swift 代码”设置为是,然后问题就消失了。

      【讨论】:

        【解决方案4】:

        我在使用 Xcode 框架模块化的项目时遇到了同样的问题。即使删除了 AppDelegate 中的所有逻辑并且只在 application:didFinishLaunchingWithOptions 中返回 true,我仍然遇到了崩溃。然后我切换到我的项目设置,在Frameworks, Libraries, and Embedded Content 部分并更改了我添加到Embed & Sign 的框架的嵌入选项。这就是为我解决问题的原因。我希望有人觉得这很有帮助。

        【讨论】:

        • 我遇到了类似的问题。就我而言,我没有链接一个框架,该框架也是项目模块化策略的一部分。奇怪的是,我能够通过 Xcode 运行该项目,但不能直接从模拟器运行,它总是在启动时崩溃。很难追踪丢失的框架,必须回到以前的提交才能找到罪魁祸首。
        【解决方案5】:

        当我创建一个 NSString,将一个 UTF8String 从它发送到另一个对象,并将它分配给一个 char 指针时,我遇到了这种症状。好吧,事实证明我忘了保留原始的 NSString,这无论如何都无关紧要,因为我也没有意识到 UTF8String 方法(可能是一个可以访问指针本身的对象)在 autorelease 中运行水池。也就是说,保留 NSString 本身并不能解决问题。

        我想这在调试器下附加时似乎工作得很好,只是因为我启用了僵尸,所以我的指针仍然有效。我应该看看这是否是它起作用的原因;如果是这样,这是在启用和不启用 NSZombie 的情况下进行测试的一个很好的理由。

        无论如何,这可能是一开始就糟糕的设计,并且在我发现它之后是一个非常明显的新手内存管理错误。幸运的是,管理器窗口中的控制台给了我一些关于从哪里开始查找的提示,调试最终向我展示了我的指针值在哪里发生变化。希望这可以帮助任何在这里找到方法的人。

        【讨论】:

          【解决方案6】:

          我在从 [[NSBundle mainBundle] resourcePath] 目录外部访问 SQLite 数据库时遇到了这个问题,这导致了 iCloud 错误。

          我只是通过在我的 iPhone 上安装一个记录错误的控制台应用程序才发现该错误。

          一旦我从正确的目录访问数据库,错误就会消失并且应用程序正确启动。

          【讨论】:

          • 控制台应用不再可用;这个问题是6年前的。我将删除该链接,但我关于从错误目录读取数据库的答案仍然有效。对我来说,反对票似乎过分了。
          猜你喜欢
          • 1970-01-01
          • 2013-08-18
          • 1970-01-01
          • 1970-01-01
          • 2014-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-27
          相关资源
          最近更新 更多