我想通过串行电缆使用WinDbg 6.2.9200.16384 x64来调试我正在写的驱动程序。 WinDbg很好地连接到目标机器(Windows 8),并且当系统启动并加载所有内容时,我会看到所有dbgprints。我可以为我的驱动程序加载符号,并且可以设置断点,当我的驱动程序遇到这些断点时,系统会按预期停止。这就是奇怪的地方:当我遇到断点时,我只能在本地窗口和使用'dv'命令时看到函数中的一些局部变量。我创建了一个变量来进行测试:WinDbg显示一些变量,但不显示其他变量,在相同的位置显示一些变量
int myInt = 8;
当我使用一个dbgprint显示敏的价值,它工作正常,我认为这是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个,只是偏移量,rcb,writeAddr和readAddr。它告诉我偏移量的值不是0x777,而是我期望的,但0xE061(每次运行代码时都会改变)。当我仔细观察当地人窗口(通过'dv'和'?varname'命令显示相同的信息时,我注意到偏移的位置和rcb的位置是完全相同的地址。同样,writeAddr和readAddr也存储在相同的地址。调试器没有检测到其他变量。
我确信我已经正确加载了符号,源代码和符号路径设置正确,我运行'.reload/f'一百万次,没有错误加载我的驱动程序符号。我仍然能够打破并通过其他代码行,但当地人没有任何意义。当我dbgprint,显示正确的值,所以这似乎是调试器本身,而不是我的驱动程序的问题。有任何想法吗?
我解决了这个问题。对于遇到同样事情的任何人来说:我正在使用免费版本的驱动程序,因此编译器已经优化了很多变量。为了解决这个问题,无论是编译驱动程序的版本检查,或行 MSC_OPTIMIZATION =/OD /爱 添加到您的源文件来禁用优化的免费版本。希望这可以帮助任何有同样问题的人。 – ben
你可以发表你的评论作为答案,并接受它,让别人更容易找到你的答案,因为人们可能不会阅读评论。 – EdChum
我没空,但SO抱怨,我是一个新用户,必须等待6个小时回答我的问题 – ben