2013-07-24 132 views
1

我想通过串行电缆使用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,显示正确的值,所以这似乎是调试器本身,而不是我的驱动程序的问题。有任何想法吗?

+0

我解决了这个问题。对于遇到同样事情的任何人来说:我正在使用免费版本的驱动程序,因此编译器已经优化了很多变量。为了解决这个问题,无论是编译驱动程序的版本检查,或行 MSC_OPTIMIZATION =/OD /爱 添加到您的源文件来禁用优化的免费版本。希望这可以帮助任何有同样问题的人。 – ben

+0

你可以发表你的评论作为答案,并接受它,让别人更容易找到你的答案,因为人们可能不会阅读评论。 – EdChum

+0

我没空,但SO抱怨,我是一个新用户,必须等待6个小时回答我的问题 – ben

回答

1

<> 时下编译器已经得到了很大的增强,以获得性能优化和其他指标更好的优化二进制文件。因此,编译器将一些变量存储为本地变量(通过'dv/v'命令可见),并将其他变量存储在寄存器中。这就是你在dv命令中看不到变量int myInt的原因。我们可以通过使用'uf binary!functionname'或通过在Windbg View-> Disassembly中查看反汇编代码来分解函数,从而知道哪些寄存器用于变量。

请注意,在性能,内存使用情况等方面,驱动程序在编译程序的优化方面可能会有所不同,因此它始终建议调试由默认优化编译程序生成的程序,因为这是一个用于实时用户场景。

1

我修复了这个问题。对于遇到同样事情的任何人来说:我正在使用免费版本的驱动程序,因此编译器已经优化了很多变量。要修复它,或者编译一个检查版本的驱动程序,或者将您的源文件添加到您的源文件,以禁用免费版本的优化。希望这可以帮助任何有同样问题的人。