Windows WinDbg显示一些变量,但不显示其他变量,在同一位置显示一些变量

Windows WinDbg显示一些变量,但不显示其他变量,在同一位置显示一些变量,windows,kernel,driver,windbg,kernel-module,Windows,Kernel,Driver,Windbg,Kernel Module,我正试图通过串行电缆使用WinDbg 6.2.9200.16384 x64调试我正在编写的驱动程序。WinDbg与目标计算机(Windows 8)的连接很好,在系统引导和加载所有内容时,我看到了所有DBGPrint。我可以很好地加载我的驱动程序的符号,并且可以设置断点,当我的驱动程序遇到这些断点时,系统会按预期停止。这就是事情变得奇怪的地方:当我遇到断点时,我只能在“局部变量”窗口和使用“dv”命令时看到函数中的一些局部变量。我创建了一个用于测试的变量: int myInt = 8; 当我使用

我正试图通过串行电缆使用WinDbg 6.2.9200.16384 x64调试我正在编写的驱动程序。WinDbg与目标计算机(Windows 8)的连接很好,在系统引导和加载所有内容时,我看到了所有DBGPrint。我可以很好地加载我的驱动程序的符号,并且可以设置断点,当我的驱动程序遇到这些断点时,系统会按预期停止。这就是事情变得奇怪的地方:当我遇到断点时,我只能在“局部变量”窗口和使用“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时,会显示正确的值,因此这似乎是调试器本身的问题,而不是我的驱动程序的问题。有什么想法吗?

现在,编译器已经得到了很大的增强,以获得具有优化性能和其他指标的更好的优化二进制文件。因此,编译器将少数变量存储为局部变量(通过“dv/v”命令可见),并将其他变量存储在它们的寄存器中。这就是为什么在dv命令中看不到变量int myInt的原因。通过使用“uf binary!”反汇编函数,我们可以知道哪些寄存器用于变量!functionname'或在Windbg视图->反汇编中查看反汇编代码


请注意,在性能、内存使用等方面,驱动程序在编译器优化和未优化的情况下的行为可能略有不同。因此,始终建议调试从默认优化编译器生成的驱动程序,因为这是在实时用户场景中使用的驱动程序。

我修复了该问题。对于其他遇到同样问题的人:我正在使用一个免费的驱动程序构建,因此编译器优化了我的许多变量。要修复它,请编译一个经过检查的驱动程序版本,或者添加行

MSC_OPTIMIZATION=/Od /Oi

添加到源文件以禁用免费版本的优化。希望这能帮助有同样问题的人。

我解决了这个问题。对于其他遇到同样问题的人:我正在使用一个免费的驱动程序构建,因此编译器优化了我的许多变量。要修复它,要么编译一个经过检查的驱动程序版本,要么将MSC_OPTIMIZATION=/Od/Oi行添加到源文件中,以禁用免费版本的优化。希望这对有同样问题的人有所帮助。你可以将你的评论作为答案发布,也可以接受它,这会让其他人更容易找到你的答案,因为人们可能不会阅读评论。我本来会这样做的,但我也抱怨说我是一个新用户,不得不等6个小时才能回答我自己的问题