iOS仅在未通过XCode运行时崩溃。巧合?

时间:2012-03-29 18:40:49

标签: ios xcode debugging crash

我的应用仅在未使用XCode调试器运行时崩溃。很难跟踪,因为我无法调试,但我终于想通了。这是因为在某些不属于我的对象上调用release。在我更正之前,我搜索并在此处找到了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次以上。

6 个答案:

答案 0 :(得分:2)

你所描述的并不是与内存相关的模糊错误的非典型。您可能还希望在此时使用debug-malloc。虽然不能保证找到一切。原因(并且可能只有源级调试器一直发生)是内存在可调试代码中至少有些不同,并且在调试器下运行时。因此,在调试器下,错误会导致不同的内存(无害)损坏。当不在调试器下时,损坏的位置实际上是您的代码所关心的内容,并且它会崩溃。

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

答案 1 :(得分:1)

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

  

尝试关闭Zombie Objects时运行。

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

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

enter image description here

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

答案 2 :(得分:0)

从[[NSBundle mainBundle] resourcePath]目录外部访问SQLite数据库时出现此问题,导致iCloud错误。

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

从正确的目录访问数据库后,错误消失,应用程序正确启动。

答案 3 :(得分:0)

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

我认为只有因为我启用了僵尸才能在调试器下连接时才能正常工作,所以我的指针仍然有效。我应该看看这是否有效;如果是这样,这是使用和不启用NSZombie进行测试的一个很好的理由。

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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