我的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代码,因此我发现这是一个内存管理问题我会感到非常惊讶。它也与一些设备隔离,但这些设备每次都在同一点崩溃。
任何人都可以提供任何见解或调试建议(假设我自己没有崩溃设备)。
谢谢,
添
答案 0 :(得分:0)
我已经解决了这个可怕的错误。
事实证明,DISPATCH_QUEUE_PRIORITY_BACKGROUND仅在5.0或更高版本上可用,并且会在先前版本上崩溃。
我实际上已经在运行4.2.1的iPhone 3G上测试了应用程序,但由于该模型根本不支持GCD,因此没有运行特定的代码路径....