8badf00d是什么意思?

51
有时我的iPhone应用程序会崩溃并出现奇怪的崩溃日志,其中读取的异常代码为0x8badf00d。堆栈跟踪显示了随机的应用程序执行快照,但没有任何可疑的内容。这种情况很少发生,我无法找到如何复现它。有人知道关于这种异常和异常代码的更多信息吗?
以下是我的崩溃日志摘录:
异常类型:00000020 异常代码:0x8badf00d 突出显示的线程:0
应用程序特定信息: 未能停用
线程0: ... <这里没有任何可疑的内容> ...
未知线程以未知的风味崩溃:5,状态计数:1

2
虽然他们都解释了错误代码,但没有人真正回答了这个问题。您能告诉我们您正在做什么来引起异常吗? - Rog
我们如何找出哪一段代码有问题? - iKushal
1
新的苹果文档针对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
7个回答

99

4
通常这意味着你要么在某个地方有一个无限循环,要么是在主线程上等待网络输入输出。还有一种可能就是用户正在强制退出应用程序。 - rpetrich
1
@IBG 当然可以。我从未使用过这些API。 - rpetrich
@IBG 你在这种情况下是如何进行测试的? - Brad Moore
@BradMoore 抱歉,我完全忘记了我是如何测试的,因为我不是专门在那个项目上工作(或者说我们有的任何iOS项目)。我想我所做的是先拒绝NSURLConnection部分,然后再把它放回去。 - IBG
@IBG 好的,我会找找看能找到什么。 - Brad Moore
显示剩余3条评论

16
如果你收到 异常类型: 00000020异常代码: 0x8badf00d,那么这是一个看门狗超时崩溃报告。异常代码 0x8badf00d 被称为"ate bad food"
最常见的导致此崩溃的原因是主线程上同步活动。 解决方法是切换到主线程上的异步活动Apple 文档截图 请参考这份 Apple 文档了解更多详细信息。

8

1
可能意味着传递了无效参数。 - Mark

5

这只是程序员开玩笑的想法。您需要为代码选择一个数字,但该数字本身并不一定有任何意义。8badf00d只是另一种写成数字2,343,432,205的方式,被选中是因为在异常日志中以十六进制表示时看起来很“有趣”。


9
我认为它不仅仅“看起来”好笑,而是确实很有趣!</主观性> :-) - Paul Sonier

5
苹果提供的看门狗会引发0x8badf00d exception异常。网络应用程序中看门狗超时崩溃的最常见原因是在主线程上进行同步网络操作。这里有四个导致问题的因素:

同步网络操作 - 这是指您发出一个网络请求并阻塞等待响应的情况。

主线程 - 一般来说,同步网络操作并不理想,但如果您在主线程上执行它,就会引起特定的问题。请记住,主线程负责运行用户界面。如果您阻塞主线程的时间超过任何可接受的时间,用户界面将变得无法接受地不响应。

长时间超时 - 如果网络突然中断(例如用户在进入隧道的火车上),任何未完成的网络请求都要等到某个超时时间才会失败。大多数网络超时时间都是以分钟为单位的,这意味着在主线程上阻塞的同步网络请求可能会使用户界面不响应几分钟。

试图通过缩短网络超时时间来避免此问题并不是一个好主意。在某些情况下,网络请求可能需要很多秒才能成功,如果您总是提前超时,那么您将永远无法取得任何进展。

看门狗 - 为了保持用户界面的响应性,iOS包括一个看门狗机制。如果您的应用程序未能及时响应某些用户界面事件(启动、挂起、恢复、终止),看门狗将终止您的应用程序并生成一个看门狗超时崩溃报告。看门狗给您的时间量没有正式记录,但它总是小于网络超时时间。

有两个常见解决方案:

异步网络操作 - 解决此问题的最佳方法是异步运行您的网络代码。异步网络代码具有许多优点,最重要的是可以让您安全地访问网络而不必担心线程。

在次要线程上进行同步网络操作 - 如果异步运行您的网络代码非常困难(也许您正在使用假定同步网络的大型可移植代码库),您可以通过在次要线程上运行同步代码来避免看门狗。

请参阅苹果文档以获取更多信息。

2

这是一个由有幽默感的开发人员添加的失败代码。因为十六进制使用字母和数字,所以可以编写看起来像英语单词的十六进制数,例如“0xdeadbeef”等。我相信异常代码有具体含义,但如果没有与之相关的主要症状,您可能可以忽略它而不会太担心。


-7

来自维基百科0xBAADF00D(“坏食物”)被微软的LocalAlloc(LMEM_FIXED)用于指示在使用调试堆时未初始化的分配堆内存。[7]


Microsoft的LocalAlloc在这里起什么作用? - Jayprakash Dubey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接