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