Skip to main content
 首页 » 编程设计

使用 GCD 时在某些设备上崩溃

2025年12月25日77Renyi-Fan

我有一个在一些设备上崩溃的 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 本身时发生的,还是在 block 代码的开头,还是在 block 本身的某个地方。

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

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

最后,TestFlight 找不到该用户使用的 iPhone 4 的 iOS 版本号 - 所以我想知道这是否是越狱设备,是否可能会产生影响? (我已经问过用户,还没有答案)。

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

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

谢谢,

蒂姆

请您参考如下方法:

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

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

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