2013-07-24 187 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

我修復了這個問題。對於遇到同樣事情的任何人來說:我正在使用免費版本的驅動程序,因此編譯器已經優化了很多變量。要修復它,或者編譯一個檢查版本的驅動程序,或者將您的源文件添加到您的源文件,以禁用免費版本的優化。希望這可以幫助任何有同樣問題的人。