什么是0x%08lx?

时间:2011-02-11 11:05:45

标签: debugging crash-dumps

我最近在工作的XP盒子上得到了很多蓝屏。事实上,我下载了很多用于Windows(x86)的调试工具,并且一直在分析崩溃转储。事实上,我已经将转储更改为mini,否则我可能最终会在每周工作半天,等待蓝屏完成详细的崩溃日志记录。

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

出于好奇心,我把“0x%08lx”放入谷歌,发现很多崩溃转储包含了这个奇怪的消息。我是否认为0x%08lx是一个有意义的东西? “%s”是结尾句子“记忆不能是%s”的一部分,看起来肯定是缺少一个变量或其他东西。

有没有人知道此消息的来源?它实际上应该是有用的吗?假设看起来像什么?

我一直都在努力解决这个问题。奇怪的是,很多人都应该在如此多的故障转储中看到这一点,没有人会说:“哦,崩溃转储没有正确地完成那个消息,它本应该读......”

我只是好奇是否有人知道这个奇怪的错误信息假象的目的。

2 个答案:

答案 0 :(得分:11)

对于C函数format specifiers

0x%08lx%s几乎肯定是sprintf。但看起来驱动程序开发人员在错误处理代码中的表现与在关键代码中的表现一样好,因为您不应该在GUI中看到这些说明符 - 它们应该替换为有意义的值。

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

%s应替换为另一个字符串,在本例中为描述。像

这样的东西
  

引用 0xE001D4AB 的内存    0xE005123F ,无法读取

请注意,我编写了这些值。基本上,发生了内核模式访问冲突。希望在迷你转储中你可以看到哪个模块导致了它并卸载/更新/无论它是什么。

答案 1 :(得分:7)

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