有人能提供相对简单的解释吗?双重恐慌与 Mac 上其他类型的内核崩溃有何不同?
简单来说...我不是开发人员,但我希望更好地理解这些事情。
背景
对这种类型的恐慌的一个大致描述:
恐慌发生时屏幕上显示“双重恐慌”一词
如果有 .panic 文件,它将不包含该短语
有时没有 .panic 文件,这也许可以解释为什么我只能找到关于双重恐慌。
以 OS X 10.8.5 为例
以下截图也与ZEVO 领域的一个主题– 我会在适当的时候继续讨论支持问题。
Safari 在前面:
在后台将 Ubuntu 12.10 安装到 VirtualBoxVM:
在后台,活动监视器:
在 Dock 中运行:Finder、活动监视器、AntiRSI……
…邮件、Safari、终端、VirtualBox 和 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 上是否仍然相关。