以下是我的崩溃日志摘录:
异常类型:00000020 异常代码:0x8badf00d 突出显示的线程:0
应用程序特定信息: 未能停用
线程0: ... <这里没有任何可疑的内容> ...
未知线程以未知的风味崩溃:5,状态计数:1
0x8badf00d
是当应用程序启动或终止时间过长时,看门狗所引发的错误代码。请参阅苹果公司的《iPhone操作系统应用崩溃报告》文档。
异常类型: 00000020
和 异常代码: 0x8badf00d
,那么这是一个看门狗超时崩溃报告。异常代码 0x8badf00d
被称为"ate bad food"
。导致此崩溃的原因是主线程上同步活动。
解决方法是切换到主线程上的异步活动
。
这只是程序员开玩笑的想法。您需要为代码选择一个数字,但该数字本身并不一定有任何意义。8badf00d
只是另一种写成数字2,343,432,205的方式,被选中是因为在异常日志中以十六进制表示时看起来很“有趣”。
0x8badf00d exception
异常。网络应用程序中看门狗超时崩溃的最常见原因是在主线程上进行同步网络操作。这里有四个导致问题的因素:
有两个常见解决方案:同步网络操作 - 这是指您发出一个网络请求并阻塞等待响应的情况。
主线程 - 一般来说,同步网络操作并不理想,但如果您在主线程上执行它,就会引起特定的问题。请记住,主线程负责运行用户界面。如果您阻塞主线程的时间超过任何可接受的时间,用户界面将变得无法接受地不响应。
长时间超时 - 如果网络突然中断(例如用户在进入隧道的火车上),任何未完成的网络请求都要等到某个超时时间才会失败。大多数网络超时时间都是以分钟为单位的,这意味着在主线程上阻塞的同步网络请求可能会使用户界面不响应几分钟。
试图通过缩短网络超时时间来避免此问题并不是一个好主意。在某些情况下,网络请求可能需要很多秒才能成功,如果您总是提前超时,那么您将永远无法取得任何进展。
看门狗 - 为了保持用户界面的响应性,iOS包括一个看门狗机制。如果您的应用程序未能及时响应某些用户界面事件(启动、挂起、恢复、终止),看门狗将终止您的应用程序并生成一个看门狗超时崩溃报告。看门狗给您的时间量没有正式记录,但它总是小于网络超时时间。
请参阅苹果文档以获取更多信息。异步网络操作 - 解决此问题的最佳方法是异步运行您的网络代码。异步网络代码具有许多优点,最重要的是可以让您安全地访问网络而不必担心线程。
在次要线程上进行同步网络操作 - 如果异步运行您的网络代码非常困难(也许您正在使用假定同步网络的大型可移植代码库),您可以通过在次要线程上运行同步代码来避免看门狗。
这是一个由有幽默感的开发人员添加的失败代码。因为十六进制使用字母和数字,所以可以编写看起来像英语单词的十六进制数,例如“0xdeadbeef”等。我相信异常代码有具体含义,但如果没有与之相关的主要症状,您可能可以忽略它而不会太担心。
来自维基百科0xBAADF00D(“坏食物”)被微软的LocalAlloc(LMEM_FIXED)用于指示在使用调试堆时未初始化的分配堆内存。[7]
8badf00d
,https://developer.apple.com/documentation/xcode/diagnosing_issues_using_crash_reports_and_device_logs/identifying_the_cause_of_common_crashes/addressing_watchdog_terminations - RY_ Zheng