我想通過串行電纜使用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