2012-03-01 41 views
0

我有一个在几台设备上崩溃的iOS应用程序。考虑到在iTunes发生这种情况时我看到的糟糕评论,崩溃似乎在代码中的相同位置发生。使用GCD时在某些设备上发生故障

最后,一个好人实际上联系了我,而不仅仅是留下评论,他们甚至在为我安装使用TestFlight的应用程序的调试版时。

武装与崩溃报告中,我可以看到它深的地方发生的malloc:给定的行号

2 libSystem.B.dylib 0x34683d6e _sigtramp + 42 
3 libSystem.B.dylib 0x3468c886 szone_malloc_should_clear + 2122 

而且,它出现在我开始一个后台任务点发生:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    UIImage *image = [self loadImage:path]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 

我不确定碰撞发生在那三条线中的哪条线上,所以目前还不清楚是否在GCD本身的调用中发生崩溃,就在块代码的开始处,或者块本身的某处。

堆栈跟踪结束在包含上面代码片段的函数中,而不是,看起来,在块本身。如果崩溃在异步模块中,堆栈跟踪是否仍将调用树包含在父函数中?我目前正在研究这样一个假设,即块内部崩溃的堆栈跟踪不会包含调用父函数(因为块在其自己的线程中异步执行),所以我认为这是对GCD的调用崩溃。

我试过使用TFLog来查找确切的故障时刻,但是根本没有记录日志。我知道日志调用是正确完成的,因为在我的开发设备上,我看到日志弹出在TestFlight记录器中,所以看起来崩溃扰乱了这个调试选项。

最后,TestFlight无法找到该用户使用的iPhone 4的iOS版本号 - 所以我想知道这是否是越狱设备,并且如果它可能可能会有效果? (我问过用户,但没有答案)。

请注意,这是所有的ARC代码,所以我很惊讶地发现这是一个内存管理问题。它也与一些设备隔离,但这些设备每次都会在同一时刻崩溃。

任何人都可以提供任何见解或调试建议(假设我自己没有崩溃设备)。

感谢,

回答

0

我已经解决了这个可怕的错误。

事实证明,DISPATCH_QUEUE_PRIORITY_BACKGROUND仅在5.0或更高版本上可用,并且会在以前的版本中崩溃。

我实际上已经在运行4.2.1的iPhone 3G上测试了该应用程序,但是由于该模型不支持GCD,所以该特定代码路径并未运行......