在 OS X 上,双重恐慌是什么?

在 OS X 上,双重恐慌是什么?

有人能提供相对简单的解释吗?双重恐慌与 Mac 上其他类型的内核崩溃有何不同?

简单来说...我不是开发人员,但我希望更好地理解这些事情。

背景

对这种类型的恐慌的一个大致描述:

  • 恐慌发生时屏幕上显示“双重恐慌”一词

  • 如果有 .panic 文件,它将不包含该短语

  • 有时没有 .panic 文件,这也许可以解释为什么我只能找到关于双重恐慌

以 OS X 10.8.5 为例

以下截图也与ZEVO 领域的一个主题– 我会在适当的时候继续讨论支持问题。

Safari 在前面:

Safari 浏览器双重恐慌的屏幕截图

在后台将 Ubuntu 12.10 安装到 VirtualBoxVM:

在后台将 Ubuntu 12.10 安装到 VirtualBoxVM

在后台,活动监视器:

在后台,活动监视器

在 Dock 中运行:Finder、活动监视器、AntiRSI……

Finder、活动监视器、AntiRSI……

…邮件、Safari、终端、VirtualBox 和 VirtualBoxVM:

在此处输入图片描述

九个交换文件:

九个交换文件

VirtualBoxVM 写入虚拟磁盘:

VirtualBoxVM 写入其虚拟磁盘

(旁注:用我的非常旧但可爱的 iPhone,我无法拍出更好的照片。)


成立

什么原因导致内核陷阱 0x00000008(SCO Unix)(2005?)提到:

…双重恐慌-内核在恐慌时也陷入恐慌。

这可能是由损坏的驱动程序代码引起的,但更可能是由于内存损坏(或 CPU 损坏、主板损坏 - 任何导致错误指令到达 CPU 的因素)

– 但那里的标题是:

这是一个古老的帖子,与现代系统几乎没有关系。

我找不到最新的权威通用解释。

笔记

在 2013-09-25 的 irc://chat.freenode.net/#macdev 中回复此问题的早期版本,有人明确表示:

  • 恐慌中的恐慌。

答案1

这只不过是内核恐慌代码中的一种安全机制,当尝试保存系统状态的代码也崩溃时,它会停止向屏幕上转储更多信息。

我们可以检查 OS X 10.8.4 中 xnu 的源代码并查看相关的处理:

http://www.opensource.apple.com/source/xnu/xnu-2050.24.15/osfmk/kern/debug.c

restart:
    PANIC_LOCK();

    if (panicstr) {
        if (cpu_number() != paniccpu) {
            PANIC_UNLOCK();
            /*
             * Wait until message has been printed to identify correct
             * cpu that made the first panic.
             */
            while (panicwait)
                continue;
            goto restart;
        } else {
            nestedpanic +=1;
            PANIC_UNLOCK();
            Debugger("double panic");
            printf("double panic:  We are hanging here...\n");
            panic_stop();
            /* NOTREACHED */
        }
    }

正如您所看到的,多个 CPU 也可能引发恐慌,并且这两个信号都需要通过相同的代码来解决 - 因此这可能是更有可能看到双重恐慌消息的载体。

模型依赖.c修改器有帮助的代码和注释来解释系统如何避免由于在多个 CPU 上运行而导致的双重恐慌。

实际上,所有恐慌信息都是可疑的,双重恐慌信息更是双重可疑,除非您能够重现该问题或关联多个转储。

答案2

在古代(1990 年代左右),有人向我解释双重恐慌是:
“在前一次恐慌发生后发生的恐慌”。

例如,出现问题,操作系统无法恢复。它别无选择,只能 panic()。

恐慌会导致它做一些事情,比如向控制台写入一条消息,可选地转储到磁盘或放入调试器。其中某处出现其他错误,从而引发第二次恐慌。第二次恐慌称为双重恐慌。

注意:我不确定这在 OS X 上是否仍然相关。

相关内容