0x8badf00d 在后台获取监听位置后崩溃

Posted

技术标签:

【中文标题】0x8badf00d 在后台获取监听位置后崩溃【英文标题】:0x8badf00d Crash after listening location on background fetch 【发布时间】:2017-10-09 21:15:01 【问题描述】:

在我的 ios 应用程序中,当我收到后台获取执行时,我开始在后台侦听用户的位置更新一段时间(最长 15 分钟)。但是,在我停止更新后,应用程序因 0x8badf00d 错误而崩溃。

我已启用后台位置和后台获取权限,并且我还在 CLLocationManager 上启用了后台位置更新。

知道为什么会发生此错误吗?

【问题讨论】:

您在使用网络服务吗?如果是这样,您需要进行异步。它阻塞了应用程序并且无法更改状态,因此崩溃。 你试过重启了吗? @RogersSampaio 我使用 AZSClient(Azure 存储客户端)将一些信息传输到 blob 服务器。从我的角度来看,它以异步方式处理工作;但我不知道它的内部结构。我会检查的。 【参考方案1】:

问题不在于它没有在后台运行,而是正在运行的东西阻塞了主线程。

0x8badf00d(“吃了不好的食物”;哈哈)表示看门狗进程(监视死/阻塞进程)杀死了你的应用程序,通常是因为你做了一些事情来阻塞主线程。如果你避免阻塞主线程,这个错误应该会消失。请参阅 Technical Note 2151: Understanding and Analyzing Application Crash Reports 并搜索 0x8badf00d

正如它所说:

异常代码0x8badf00d 表示应用程序已被iOS 终止,因为发生了看门狗超时。应用程序启动、终止或响应系统事件的时间过长。造成这种情况的一个常见原因是synchronous networking on the main thread。 Thread 0 上的任何操作都需要移至后台线程,或以不同方式处理,以免阻塞主线程。

他们专注于同步网络请求,但它可能是阻塞主线程太久的任何事情,无论是缓慢的同步进程还是死锁或其他什么。您应该查看线程 0 的堆栈跟踪,看看您是否可以确定是什么阻塞了主线程。不过,这里还不足以让我们诊断它。

常见的罪魁祸首包括同步网络调用、同步 GCD 调用、信号量的不当使用、锁或调度组“等待”调用、死锁等。

【讨论】:

以上是关于0x8badf00d 在后台获取监听位置后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS11 看门狗超时崩溃(0x8badf00d)但代码不在堆栈上

iOS 应用程序因终止原因而崩溃:命名空间 SPRINGBOARD,代码 0x8badf00d

我在 iPhone 应用程序中收到错误 0x8badf00d,这不是通常的嫌疑人

由于看门狗,我的应用程序从后台返回时崩溃

iPhone 崩溃日志 - 已用 CPU 时间是多少

Crash分析