我正在尝试通过串行电缆使用 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。它告诉我 offset 的值不是我期望的 0x777,而是 0xE061(每次运行代码时都会改变)。当我仔细查看 locals 窗口时(通过 'dv' 和 '?varname' 命令显示相同的信息),我注意到 offset 的位置和 rcb 的位置是完全相同的地址。同样,writeAddr 和 readAddr 也存储在相同的地址。调试器未检测到任何其他变量。
我确信我已经正确加载了符号,源和符号路径设置正确,我已经运行了 '.reload /f' 一百万次,加载驱动程序的符号没有错误。我仍然能够打破并单步执行其他代码行,但当地人没有任何意义。当我进行 dbgprint 时,会显示正确的值,因此这似乎是调试器本身的问题,而不是我的驱动程序的问题。有任何想法吗?