使用GCD时某些设备崩溃

时间:2012-03-01 08:14:46

标签: crash grand-central-dispatch

我的iOS应用程序崩溃了几台设备。鉴于我在iTunes上看到的错误评论发生这种情况时,崩溃似乎发生在代码中的同一点。

最后,一个好人实际联系了我而不是仅仅留下评论,他们甚至为我使用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(), ^{

我不确定崩溃发生在这3行中的哪一行,因此不清楚崩溃是在调用GCD本身时发生的,是在块代码的开头,还是在块本身的某个地方。

堆栈跟踪最终会出现在包含上面代码片段的函数中,而不是在块本身中。如果崩溃在异步块中,堆栈跟踪是否仍包含父函数的调用树?我目前正在假设块中崩溃的堆栈跟踪不包括对父函数的调用(因为块在其自己的线程中异步执行),所以我认为这是对GCD的调用崩溃了

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

最后,TestFlight无法找到该用户正在使用的iPhone 4的iOS版本号 - 所以我想知道这是否是一个越狱设备,如果它可能有效果? (我已经问过用户,还没有回答)。

请注意,这是所有ARC代码,因此我发现这是一个内存管理问题我会感到非常惊讶。它也与一些设备隔离,但这些设备每次都在同一点崩溃。

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

谢谢,

1 个答案:

答案 0 :(得分:0)

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

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

我实际上已经在运行4.2.1的iPhone 3G上测试了应用程序,但由于该模型根本不支持GCD,因此没有运行特定的代码路径....