Gra*_*rin 5 mac kernel-panic macos
谁能提供一个相对简单的解释,说明双恐慌与 Mac 上其他类型的内核恐慌有何不同?
很简单……我不是开发人员,但我希望能更好地理解这些东西。
对这种类型的恐慌的松散描述:
恐慌时屏幕上的短语“双重恐慌”
如果有一个 .panic 文件,它将不包含该短语
有时没有 .panic 文件,这可以解释为什么我只能找到关于double panics 的有限讨论。
下面的屏幕截图也将与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 中,在回答这个问题的早期版本时,有人明确表示:
这是内核恐慌代码中的一种安全机制,用于在尝试保存系统状态的代码也崩溃时停止向屏幕转储更多信息。
我们可以在 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.c和kmod.c有有用的代码和注释来说明系统如何试图避免只是由于对多个CPU上运行双恐慌。
在实践中,所有恐慌信息都是可疑的,除非您可以重现问题或关联多个转储,否则双重恐慌信息是双重可疑的。