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

Gra*_*rin 5 mac kernel-panic macos

谁能提供一个相对简单的解释,说明双恐慌与 Mac 上其他类型的内核恐慌有何不同?

很简单……我不是开发人员,但我希望能更好地理解这些东西。

背景

对这种类型的恐慌的松散描述:

  • 恐慌时屏幕上的短语“双重恐慌”

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

  • 有时没有 .panic 文件,这可以解释为什么我只能找到关于double panics 的有限讨论。

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 中,在回答这个问题的早期版本时,有人明确表示:

  • 恐慌中的恐慌。

bmi*_*ike 5

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

我们可以在 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 */
        }
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,多个 CPU 也可能引发恐慌,并且这两个信号都需要由相同的代码解决 - 因此这可能是一个更有可能看到双重恐慌消息的向量。

此外model_dep.ckmod.c有有用的代码和注释来说明系统如何试图避免只是由于对多个CPU上运行双恐慌。

在实践中,所有恐慌信息都是可疑的,除非您可以重现问题或关联多个转储,否则双重恐慌信息是双重可疑的。