close

 


電腦當機畫面 http://www.mobile01.com/topicdetail.php?f=174&t=765856&last=9051136




 如何使用驅動程式檢查器疑難排解 Windows 驅動程式






重要 本文包含有關修改登錄的相關資訊。修改登錄之前,請務必將它備份起來,並瞭解如何在發生問題時還原登錄。如需有關如何備份、還原和編輯登錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
256986  (http://support.microsoft.com/kb/256986/ ) Microsoft Windows 登錄說明


 


在此頁中


 




 


結論


 


驅動程式檢查器隨附於 Windows 2000、Windows XP 和 Windows Server 2003 中,用以提升穩定性與可靠性;您可以使用這個工具...


 

驅動程式檢查器隨附於 Windows 2000、Windows XP 和 Windows Server 2003 中,用以提升穩定性與可靠性;您可以使用這個工具疑難排解驅動程式的問題。不當撰寫的驅動程式 (例如舊版的 Windows Driver Model (WDM) 驅動程式) 會使 Windows 核心模式元件導致系統損毀或系統失敗。本文說明如何使用驅動程式檢查器隔離並疑難排解系統中的驅動程式。

 


 


其他相關資訊


 


本文討論下列主題: 驅動程式檢查器功能 I/O 檢查器 驅動程式檢查器需求 啟用驅動程式檢查器 偵錯驅動程式檢查器違規 驅動程式檢查器與圖形驅動程式 驅動程式檢...


本文討論下列主題:



  • 驅動程式檢查器功能
  • I/O 檢查器
  • 驅動程式檢查器需求
  • 啟用驅動程式檢查器
  • 偵錯驅動程式檢查器違規
  • 驅動程式檢查器與圖形驅動程式
  • 驅動程式檢查器管理員 (Verifier.exe)
  • 通用計數器
  • 集區追蹤
  • 設定
  • 動態設定
  • 命令列介面
  • 驅動程式開發人員的額外資訊


 


驅動程式檢查器功能

您可以執行 Verifier.exe 以使用驅動程式檢查器,然後再重新啟動電腦。您不必做任何其他變動,就可以開始分析系統中的驅動程式。

驅動程式檢查器提供下列功能。

 


集區配置

嘗試從特殊集區中配置驅動程式所有的集區配置。此驅動程式的配置是由 No Access 權限所隔離及繫結,而不是與系統的其他部分共用集區配置。此功能會判斷驅動程式的配置是否超出集區的共用配置,因而造成損毀和系統不穩定。當您啟用此功能且目標電腦具有足夠的實體和虛擬記憶體時,驅動程式的所有配置會自動地重新導向至特殊集區。

 


提供極大的記憶體壓力

極大的記憶體壓力可以用於特定的驅動程式,而不會影響到其他驅動程式 (不論系統記憶體大小)。如果要使用這項功能,請透過記憶體管理將驅動程式所有可分頁的程式碼和資料,以及系統分頁集區、程式碼和資料變成無效。如此可以讓您偵測到不正確地佔據 Spin Lock 或提高 IRQL 並存取分頁程式碼或資料的驅動程式。您可以使用 Extreme Memory Pressure 來偵測偶發性的問題並隔離原因。

 


參數驗證

驅動程式所做出的所有 Spin Lock、IRQL 和集區配置呼叫都會收到自動參數驗證。這表示會執行檢查以確認下列事項:

  • 提高的 IRQL 確實是提高的 IRQL (目前 IRQL 少於目標 IRQL)。
  • 降低的 IRQL 確實是降低的 IRQL。
  • Spin Lock 雙重釋放。
  • Spin Lock 的取得/釋放是在適當的 IRQL 執行。
  • 分頁集區的配置/釋出是在正確的 IRQL 執行 (APC_LEVEL 或以下)。
  • 非分頁集區的配置/釋出是在正確的 IRQL 執行 (DISPATCH_LEVEL 或以下)。
  • 沒有隨機 (未初始化) 的值會被指定到這些應用程式發展介面 (API)。

 


集區配置插入失敗

未被驅動程式標示為 MUST_SUCCEED 的集區配置可能會被隨機地棄置,以確保驅動程式能夠正確地處理低記憶體的狀況。

 


釋放的集區

所有正要被釋放的集區都會被檢查,以確保集區配置內部沒有擱置的計時器,因為這些情形可能會導致非常難以追蹤系統當機。

 


集區漏洞偵測

驅動程式的所有集區配置都被自動追蹤。在驅動程式卸載期間,如果釋放了任何配置,會啟動錯誤檢查。您可以使用 !verifier 3 核心偵錯命令來顯示所有未被釋放的配置。您也可以在卸載前的任何時間點使用此命令,以檢視驅動程式中尚未處理完畢的配置。

 


驅動程式卸載檢查

驅動程式卸載檢查是為了捕捉卸載但沒有清空已使用資源的驅動程式 (這樣會增加驅動程式卸載後立刻進行系統錯誤檢查的可能性)。驅動程式未刪除的資源包括了旁觀清單、擱置的延遲程序呼叫 (DPC)、背景工作執行緒、佇列、計時器和其他資源。

 


I/O 檢查器

如果您使用檢查器工具或 VerifyDriverLevel 登錄機碼開啟 I/O 檢查器旗標 (如需詳細資訊,請參考本文<啟用驅動程式檢查>一節),就會開啟某些 I/O 管理員檢查。其中包含:

  • 所有透過 IoAllocateIrp 配置的 IRPS 會從特殊集區配置。
  • 在 IoCallDriver、IoCompleteRequest 和 IoFreeIrp 中會執行檢查以捕捉驅動程式錯誤訊息。
  • 所有 I/O 檢查器失敗錯誤都會以 DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9) 程式碼進行檢查。


 


驅動程式檢查器需求

唯一的需求是您必須安裝 Windows 2000、Windows XP 或 Windows Server 2003。您可以在 Windows 的零售和已檢查版本上啟用驅動程式檢查器。如需有關您在執行伺服器上啟用驅動程式檢查器管理員之前的考量事項的資訊,請參閱「Microsoft 知識庫」文件編號 251233。如果已安裝 Norton Antivirus,請依照「Microsoft 知識庫」文件 325672 中的建議,不要啟用驅動程式檢查器的「鎖死偵測」。

 


啟用驅動程式檢查器

您可以使用 Verifier.exe 啟用驅動程式檢查器。Verifier.exe 隨附於 Windows 中,並會自動安裝到 System32 資料夾中。Verifier.exe 具有命令列介面和圖形化使用者介面 (GUI,Graphical User Interface),所以您可以指定所要檢查的驅動程式和適當等級。或者,您也可以即時監看驅動程式檢查器統計數據。如需詳細資訊,請參考本文<驅動程式檢查器管理員>一節。

 


偵錯驅動程式檢查器違規

在核心偵錯程式的 !verifier 命令和 Verifier.exe 工具中均會即時顯示驅動程式檢查器目前的設定和統計數據。

所有驅動程式檢查器違規都會造成錯誤檢查,最常見的 (未必全部) 為:

  • IRQL_NOT_LESS_OR_EQUAL 0xA
  • PAGE_FAULT_IN_NONPAGED_AREA 0x50
  • PAGE_FAULT_IN_NONPAGED_AREA 0x50
  • ATTEMPTED_WRITE_TO_READONLY_MEMORY 0xBE
  • SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION 0xC1
  • DRIVER_VERIFIER_DETECTED_VIOLATION 0xC4
  • DRIVER_CAUGHT_MODIFYING_FREED_POOL 0xC6
  • TIMER_OR_DPC_INVALID 0xC7
  • DRIVER_VERIFIER_IOMANAGER_VIOLATION 0xC9


 


驅動程式檢查器與圖形驅動程式

Windows 核心模式圖形驅動程式 (例如印表機和顯示器驅動程式 DLL) 無法直接呼叫集區進入點。更明確地說,是間接地使用圖形裝置驅動程式介面 (DDI,Device Driver Interface) 回呼至 Win32k.sys,以執行集區配置。例如,EngAllocMem 是圖形驅動程式所呼叫,以明確配置集區記憶體的回呼。另外,其他具有特殊功能的回呼,例如 EngCreatePalette 和 EngCreateBitmap 會傳回集區記憶體。

為了提供圖形驅動程式同類型的自動化測試,已經在 Win32k.sys 中加入某些驅動程式檢查器功能。然而,因為圖形驅動程式比其他核心模式的驅動程式具有更多限制,所以前者只需驅動程式檢查器功能中的一部分。具體而論,IRQL 檢查和 I/O 檢查是不需要的。其他功能,也就是特殊集區的使用、集區配置的隨機棄置和集區追蹤,均有所支援,以便在不同的圖形 DDI 回呼中變更不同的等級。


可支援下列圖形 DDI 回呼函數的隨機棄置:

  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath
此外,特殊集區和集區追蹤的使用也在 EngAllocMem 中得到支援。

啟用圖形驅動程式的驅動程式檢查器的方式與其他驅動程式完全相同 (如需詳細資訊,請參考本文<啟用驅動程式檢查器>一節)。未受支援的旗標 (例如 IRQL 檢查) 會被忽略。另外,您可以使用 !gdikdx.verifier 核心偵錯器命令,來檢驗目前 Driver Verifier 的狀態和圖形驅動程式的集區追蹤。

注意:在強固性測試中,您只能使用隨機配置棄置設定。使用此設定可能會造成轉譯錯誤訊息,所您不應在檢查性測試中使用此設定來檢查圖形驅動程式實作的正確性 (例如,將圖形驅動程式輸出與參考圖片相比較)。

 


驅動程式檢查器管理員 (Verifier.exe)

驅動程式檢查器管理員工具 (Verifier.exe) 是在建立和修改驅動程式檢查器設定,以及從驅動程式檢查器收集統計數據時建議使用的工具。在每個 Windows 安裝中 Verifier.exe 均位於 %WinDir%\System32 資料夾中。

 


驅動程式狀態

[驅動程式狀態] 內容頁提供您驅動程式檢查器目前狀態的影像。您可以看到檢查器偵測到哪個驅動程式。狀態可能是下列其中一種:

  • Loaded (已載入):此驅動程式目前已載入且已檢查。
  • Unloaded (未載入):此驅動程式目前未載入,但從電腦重新啟動之後至少載入過一次
  • Never Loaded (未曾載入):此驅動程式未曾載入。此狀態表示此驅動程式的影像檔案已損毀,或者您指定了系統中已遺失的驅動程式名稱。
您可以按一下清單標題以依照驅動程式名稱或狀態,將清單排序。在對話方塊的右上區域中,您可以檢視目前執行中的檢查類型。如果您未切換到手動重新整理模式 (Manual Refresh Mode),則驅動程式的狀態會自動更新。您可以使用對話方塊左下區域中的選項按鈕來修改重新整理的頻率。或者,您也可以按下 [立即更新] 以強制更新狀態。

如果您啟用 Special Pool 旗標,且移動到特殊集區的集區配置少於 95%,此頁會顯示警告訊息。如此表示您需要選取較小的檢查驅動程式集合或在電腦中增加更多實體記憶體,以取得集區配置檢查較佳的涵蓋範圍。

 


通用計數器

[通用計數器] 內容頁顯示某些由驅動程式檢查器所維護之計數器目前的值。計數器的零值可能表示相關 Driver Verifier 旗標未啟用。例如,Other/Faults 計數器的 0 值表示 Low Resource Simulation 旗標號未啟用。因為計數器的值在預設狀況下會自動更新,所以您可以監控檢查器的活動。您可以修改重新整理的頻率、切換到手動重新整理或使用對話方塊左下區域的控制項群組以強制重新整理。

 


集區追蹤

此內容頁說明更多驅動程式檢查器所收集的統計數據。此內容頁所顯示的所有計數器均與檢查器的 Pool Tracking 旗標有關。其中多數均是以每個驅動程式為單位的計數器 (例如,目前配置、目前配置位元組,等等)。這表示您必須在頂端組合方塊中選取驅動程式名稱,才能檢視此驅動程式的計數器。

 


設定

您可以使用此頁建立或修改驅動程式檢查器設定。這些設定是儲存在登錄中,且您必須重新啟動電腦才能讓設定生效。您可以使用此清單來檢視目前安裝的驅動程式。每個驅動程式可能處於下列狀態之一:

  • Verify Enabled (啟用檢查):此驅動程式目前正在檢查。
  • Verify Disabled (停用檢查):此驅動程式目前不會被檢查。
  • Verify Enabled (Reboot Needed) (啟用檢查 (需要重新開機)):此驅動程式只有在下次重新啟動後,才會被檢查。
  • Verify Disabled (Reboot Needed) (停用檢查 (需要重新開機)):此驅動程式目前正在檢查,但下次重新啟動後就不會被檢查。
您可以在清單中選擇一或多個驅動程式,並使用清單下方的兩個按鈕來切換狀態。您可以用右鍵按一下驅動程式名稱以顯示快顯功能表,並在此執行狀態進行切換。

在對話方塊的底部,您可以指定下次重新啟動之後,想要檢查的其他驅動程式 (以空格隔開)。當您想要安裝尚未載入的新驅動程式時,通常會使用此編輯控制項。

如果清單頂端的選項按鈕群組設為 [檢查所有驅動程式],則清單和 [檢查][不檢查] 按鈕及編輯控制項就無法使用。這表示下次重新啟動之後,會檢查系統中所有的驅動程式。

您可以使用對話方塊右上區域的核取方塊來設定檢查類型。您可以將 I/O 檢查啟動在第 1 級或第 2 級。第 2 級的檢查功能比第 1 級強。

您必須按下 [套用] 以儲存所有設定的修改。此頁還有兩個按鈕:

  • Preferred Settings (偏好設定):此功能會選擇某些最常用的設定 (會檢查所有驅動程式)。
  • Reset All (全部重新設定):如此會清除所有驅動程式檢查器設定而不檢查任何驅動程式。
在您按下 [套用] 之後,必須重新啟動電腦才能讓所做的變更生效。

 


動態設定

您可以使用此內容頁,立即變更驅動程式檢查器旗標。您只能夠切換某些驅動程式檢查器旗標的狀態,而無法變更要檢查的驅動程式清單。在您更改某些核取方塊的狀態後,必須按一下 [套用] 才能讓變更生效。所做的變更會立即生效,並持續使用,直到您做了其他變更或重新啟動電腦。

 


命令列介面

您也可以從命令列執行 Verifier.exe (如需詳細資訊,請在命令提示中輸入 verifier.exe /?)。下列清單說明最常用的命令列旗標:

  • verifier.exe /flags value [/iolevel 2]
    指定驅動程式檢查器旗標的十進位值,以及 I/O 檢查的等級 (如需可用旗標的清單,請在命令提示中輸入 verifier.exe /? 或參考本文中<啟用驅動程式檢查器>一節)。

    請將 value 參數取代為下列檢查刻度值:
    0 - 特殊集區檢查
    1 - 強制 IRQL 檢查
    2 - 低資源模擬
    3 - 集區追蹤
    4 - I/O 檢查
    5 - 鎖死偵測
    6 - 加強 I/O 檢查
    7 - DMA 檢查
    例如,輸入下列命令:
    c:\verifier /flags 3 /iolevel 2
    注意:預設 I/O 檢查等級為 1。如果 I/O 檢查刻度未在旗標中加以設定,那麼這個值就會被忽略。
  • verifier.exe /all
    檢查系統中所有驅動程式。
  • verifier.exe /volatile /flags value
    立即變更檢查器旗標。
  • verifier.exe /reset
    清除所有目前驅動程式檢查器的設定。
  • verifier /query
    將目前驅動程式檢查器狀態和計數器傾印到標準輸出。
  • verifier.exe /log LOG_FILE_NAME [/interval seconds ]
    將驅動程式檢查器狀態和計數器記錄在記錄檔案中 (其中 seconds 是您指定的時間週期)。


 


驅動程式開發人員的額外資訊

下面將說明驅動程式開發人員可能會感興趣的驅動程式檢查器設定的其他詳細資料。IT 專業人員通常不需要這些設定。
警告 不當使用「登錄編輯程式」可能會導致嚴重的問題,甚至必須重新安裝作業系統。Microsoft 並不保證可以解決您不當使用「登錄編輯程式」所導致的問題。請自行承擔使用「登錄編輯程式」的一切風險。
如果要編輯登錄以啟動驅動程式檢查器,請執行下列步驟:

  1. 啟動 [登錄編輯程式] (Regedt32)。
  2. 找出下列登錄機碼:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers
  3. 編輯 REG_SZ 機碼。
將 REG_SZ 機碼設定為您要測試的驅動程式的名稱 (不區分大小寫)。您可以指定多個驅動程式,但只能使用一個驅動程式。這樣一來,您可以確保不會提前耗盡可用的系統資源。雖然提前耗盡資源不會造成系統可靠性的問題,但是會造成略過部分的驅動程式檢查。

下面的清單是 REG_SZ 機碼值的範例:

  • Ntfs.sys
  • Win32k.sys ftdisk.sys
  • *.sys
您可以在下列登錄機碼中指定驅動程式檢查的等級:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel 下面的清單列出了此機碼的位元欄位值。您可以隨意組合這些值:

  • 0x01:試著從特殊集區中滿足所有配置。
  • 0x02:將記憶體壓力套用到此驅動程式,以驗證有關存取可分頁程式碼和資料的 IRQL 使用。
  • 0x04:隨機棄置不同的集區配置要求。只有在系統已啟動,並且處於此問題被視為合理狀況而必須加以處理的狀態之後,才會執行此動作。
  • 0x08:啟用集區配置追蹤。每個配置必須在驅動程式卸載或系統執行錯誤檢查之前被釋放。
  • 0x10:啟動 I/O 檢查器。
注意:如果機碼不存在,或者您沒有指定驅動程式檢查的等級,則預設值為 3。如果您使用「檢查器公用程式」中的「喜好的設定」,則預設值為 0x1B。如果要追蹤記憶體遺漏,請嘗試 0xB 的值。最容易取得這個值的方式是按一下以選取 [喜好的設定] 核取方塊,然後按一下以清除 [I/O 檢查] 核取方塊即可。






這篇文章中的資訊適用於:



  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 2000 Datacenter Server
  • Microsoft Windows XP Home Edition (家用版)
  • Microsoft Windows XP Professional
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)

 


資料來源: http://support.microsoft.com/kb/244617/zh-tw#top



arrow
arrow
    全站熱搜
    創作者介紹
    創作者 gomaew 的頭像
    gomaew

    บ้านเก่าะแมว

    gomaew 發表在 痞客邦 留言(0) 人氣()