我最近在工作时在我的 XP 盒子上遇到了很多蓝屏。事实上,我下载了 Windows(x86) 的调试工具并一直在分析故障转储。事实上,我已经将转储改为迷你转储,否则我可能会每周花费半个工作日等待蓝屏完成详细的崩溃日志记录。
几乎无一异常(exception),每个转储都告诉我蓝屏的原因是某种内存分配错误或错误引用,并且 0x%08lx 处的内存引用了 0x%08lx 并且不能是 %s。
出于好奇,我将“0x%08lx”放入谷歌,发现不少故障转储都包含这条奇怪的消息。我是否认为 0x%08lx 是应该有意义的东西的占位符? “%s”是结论句“内存不可能是 %s”的一部分,它看起来肯定缺少变量或其他东西。
有谁知道这条消息的出处?它实际上应该有用吗?它是什么假设 看起来像?
这不是我一直在解决的主要问题。奇怪的是,这么多人会在这么多故障转储中看到这一点,而没有人说:“哦,故障转储没有正确完成它应该读取的消息......”
我只是好奇是否有人知道这个奇怪的错误消息伪影的目的。
请您参考如下方法:
0x%08lx和 %s几乎可以肯定format specifiers对于 C 函数 sprintf .但看起来驱动程序开发人员在错误处理代码中的表现与在关键代码中一样出色,因为您永远不会在 GUI 中看到这些说明符——它们应该被替换为有意义的值。0x%08lx应该变成类似于“0xE001D4AB”的东西,一个十六进制的 32 位指针值。%s应该被另一个字符串替换,在这种情况下是描述。就像是
the memory at 0xE001D4AB referenced 0xE005123F and could not be read.
请注意,我组成了这些值。基本上,发生了内核模式访问冲突。希望在迷你转储中,您可以看到哪个模块导致它并卸载/更新/不管它。




