5

我最近在工作时在我的 XP 盒子上遇到了很多蓝屏。事实上,我下载了 Windows(x86) 的调试工具并一直在分析故障转储。事实上,我已经将转储改为迷你转储,否则我可能会每周花费半个工作日等待蓝屏完成详细的崩溃日志记录。

几乎无一例外,每个转储都告诉我蓝屏的原因是某种内存分配错误或错误引用,并且 0x%08lx 处的内存引用了 0x%08lx 并且不能是 %s。

出于好奇,我将“0x%08lx”放入谷歌,发现不少故障转储都包含这条奇怪的消息。我是否认为 0x%08lx 是应该有意义的东西的占位符?“%s”是结论句“内存不可能是 %s”的一部分,它看起来肯定缺少变量或其他东西。

有谁知道这条消息的出处?它实际上应该有用吗?它应该是什么样子?

这不是我一直在解决的主要问题。奇怪的是,这么多人会在这么多故障转储中看到这一点,而没有人说:“哦,故障转储没有正确完成它应该读取的消息......”

我只是好奇是否有人知道这个奇怪的错误消息伪影的目的。

4

2 回答 2

11

0x%08lx并且%s几乎可以肯定是 C 函数sprintf的格式说明符。但看起来驱动程序开发人员在错误处理代码中的表现与在关键代码中一样出色,因为您永远不会在 GUI 中看到这些说明符——它们应该被替换为有意义的值。

0x%08lx应该变成类似于“0xE001D4AB”的东西,一个十六进制的 32 位指针值。

%s应该被另一个字符串替换,在这种情况下是描述。就像是

0xE001D4AB处的内存引用 了 0xE005123F并且无法读取

请注意,我组成了这些值。基本上,发生了内核模式访问冲突。希望在迷你转储中,您可以看到哪个模块导致它并卸载/更新/不管它。

于 2011-02-11T11:12:12.577 回答
8

我相信它只是内存地址的占位符。0x是一个字符串前缀,它会通知用户它是一个十六进制,而它是%08lx一个 long int () 的实际占位符,它l转换为x带有 8 个零 () 填充的十六进制 ( 08)。

于 2011-02-11T11:13:16.850 回答