使用 KD 對 User-Mode 失敗進行偵錯
若要正確偵錯使用者模式失敗,您需要 CDB 或 WinDbg。 不過,有時候使用者模式例外狀況會中斷為 KD,因為沒有任何使用者模式偵錯工具存在。 在偵錯核心模式問題時,監視特定使用者模式進程正在執行的動作也很有説明。
根據預設,核心偵錯工具會嘗試載入符合 k、 u或 ln 命令 () 指定位址的第一個使用者模式符號。
不幸的是,使用者模式符號通常不會在符號路徑中指定,或第一個符號不是正確的符號。 如果符號不存在,請將它們複製到符號路徑,或使用 . (設定符號路徑) 命令指向完整的符號樹狀結構,然後使用 .reload (Reload Module) 命令。 如果載入錯誤的符號,您可以執行.reload < binary.ext >來明確載入符號。
大部分的 Windows DLL 都會重新建立基底,使其在不同的位址載入,但有例外狀況。 視訊配接器是最常見的例外狀況。 有數十個視訊配接器全都以相同的基底位址載入,因此 KD 幾乎一律會找到第一個視訊符號 ati.dll (,依字母順序) 。 針對影片,還有一個載入 .sys 檔案,可使用 lm 命令加以識別。 透過該資訊,您可以發出 .reload 以取得正確的影片 DLL。 偵錯工具有時候會混淆並重載特定符號,有助於提供正確的堆疊。 取消群組函式,以查看符號是否看起來正確。
與影片 DLL 類似,幾乎所有可執行檔都會以相同的位址載入,因此 KD 會報告存取權。 如果您在存取中看到堆疊追蹤,請執行 !process ,然後執行指定之可執行檔名稱的 .reload 。 如果可執行檔在符號路徑中沒有符號,請在該處複製它們,然後再次執行 .reload 。
有時候,即使完整符號樹狀結構位於符號路徑中,KD 或 WinDbg 仍無法載入正確的使用者模式符號。 在此情況下,ntdll.dll 和 kernel32.dll 是需要最常見的兩個符號。 在從 KD 偵錯 CSRSS 的情況下,winsrv.dll 和 csrsrv.dll 也是載入的常見 DLL。