WinDbg显示了一些变量而不是其他变量,显示了同一位置的一些变量

时间:2013-07-24 18:39:52

标签: windows kernel driver windbg kernel-module

我正在尝试通过串行电缆使用WinDbg 6.2.9200.16384 x64来调试我正在编写的驱动程序。 WinDbg很好地连接到目标机器(Windows 8),我在系统启动时看到所有dbgprints并加载所有内容。我可以为我的驱动程序加载符号并且可以设置断点,当我的驱动程序命中这些断点时,系统会按预期停止。这是事情变得奇怪的地方:当我遇到一个断点时,我只能在本地窗口和使用'dv'命令时看到我的函数中的一些局部变量。我创建了一个变量来测试:

int myInt = 8;

当我使用dbgprint显示myInt的值时,它工作正常,我将其视为8.但是,该变量甚至根本没有出现在本地窗口或“dv”命令中。其他变量也是如此,例如

ULONG rcb = 0;

我可以在本地窗口看到它的价值。这些变量字面上是一个接一个地声明的。

这个奇怪问题的另一个症状就是这个。我有一个功能

ULONG someFunction(UINT16 offset) {
   ULONG rcb, tempAddr, temp, temp1;
   ULONG writeAddr, readAddr;
   UINT16 dev;

   dev = 15;
   ...
}

我这样称呼这个函数:

someFunction(0x777);

当我在这个函数中设置断点并使用WinDbg检查变量值时,没有任何意义。首先,它只看到我的8个变量中的4个,只有offset,rcb,writeAddr和readAddr。它告诉我偏移的值不是我想象的0x777,而是0xE061(每次运行代码时这都会改变)。当我仔细观察本地窗口时(通过'dv'和'?varname'命令显示相同的信息)我注意到偏移的位置和rcb的位置是完全相同的地址。同样,writeAddr和readAddr也存储在同一地址。调试器没有检测到其他变量。

我确信我已正确加载符号,源路径和符号路径设置正确,我运行'.reload / f'一百万次,没有加载我的驱动程序符号的错误。我仍然能够打破并逐步完成其他代码行,但本地人只是没有任何意义。当我使用dbgprint时,会显示正确的值,因此看起来这是调试器本身的问题,而不是我的驱动程序。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

<> 如今,Compiler已经得到了很大的改进,可以通过优化的性能和其他指标来获得更好的优化二进制文件。因此编译器将少量变量存储为本地(通过'dv / v'命令可见)并将其他变量存储在寄存器中。这就是你没有在dv命令中看到变量 int myInt 的原因。我们可以通过使用'uf binary!functionname'或通过在Windbg View中查看反汇编代码来解析函数来了解哪些寄存器用于变量。拆卸。

请注意,在性能,内存使用等方面,无论编译器是否优化,驱动程序的行为都可能略有不同。因此,总是建议调试从默认优化编译器生成的驱动程序,因为这是使用的在实时用户场景中。

答案 1 :(得分:1)

我解决了这个问题。对于遇到同样事情的其他人:我正在使用驱动程序的免费构建,因此编译器已经优化了我的很多变量。要修复它,要么编译驱动程序的已检查版本,要么添加行

MSC_OPTIMIZATION=/Od /Oi

到您的sources文件以禁用免费构建的优化。希望这可以帮助任何有同样问题的人。