2012-03-29 75 views
5

我的应用程序仅在未使用XCode调试器运行时崩溃。很难追踪,因为我无法调试,但我终于明白了。这是因为在某些不属于我的物体上发布了释放。之前我纠正它,我搜查,发现这里2个相关的问题(下面的链接)只有在没有通过XCode运行时才会崩溃。 Concidence?

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?

上述问题均没有回答为什么没有崩溃通过debugger.So运行时,我的问题是,为什么它发生?我知道调试/发布特定崩溃的原因,但这很疯狂。这是偶然的,虽然它发生了10次以上。

+0

您是否尝试过启用僵尸分析? – CodaFi 2012-03-29 18:42:57

+0

不,但我想通过寻找dealloc方法,我发送释放消息给僵尸对象。 – msk 2012-03-29 18:49:03

回答

2

你所描述的并不是非典型的与内存相关的晦涩问题。你可能也想在这种时候使用debug-malloc。虽然这不能保证找到一切。原因(可能只要存在源代码级调试器就会发生)是因为内存在可调试代码中以及在调试器下运行时至少有点不同。所以在调试器下,错误会导致不同的内存被损坏(无害地)。当不在调试器下时,被损坏的位置实际上是代码关心的东西,并且它崩溃了。

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

0

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

我发现错误只有通过安装控制台到我的iPhone记录错误。

http://itunes.apple.com/us/app/console/id317676250

有一次,我从正确的目录访问的数据库,错误消失,应用正确引导。

0

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

我想这似乎工作得很好,因为我有僵尸启用,因此我有的指针仍然有效。我应该看看这是否是它工作的原因;如果是这样,这是一个很好的理由来测试启用和不启用NSZombie。

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

0

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

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

相关问题