低資源模擬
當 [低資源模擬] 選項 (Windows 8.1) 中稱為隨機化低資源模擬時,驅動程式驗證器會失敗驅動程式記憶體配置的隨機實例,如果驅動程式在記憶體不足的電腦上執行,就可能發生此情況。 這會測試驅動程式正確回應低記憶體和其他低資源狀況的能力。
低資源模擬測試會失敗呼叫數個不同的函式所要求的配置,包括 ExAllocatePoolWithXXX、 MmGetSystemAddressForMdlSafe、 MmProbeAndLockPages、 MmMapLockedPagesSpecifyCache和 MmMapIoSpace。
從 Windows Vista 開始,低資源模擬測試也會將錯誤插入 IoAllocateIrp、 IoAllocateMdl、 IoAllocateWorkItem、 IoAllocateErrorLogEntry、 MmAllocateContiguousMemory、 MmAllocateContiguousMemorySpecifyCache、 MmAllocatePagesForMdl和 MmAllocatePagesForMdlEx。 此外,從 Windows Vista 開始,啟用低資源模擬時,呼叫 KeWaitForMultipleObjects 或 KeWaitForSingleObject 並將 Alertable 參數設為 TRUE 時,可以在非特殊許可權進程的內容中執行時傳回STATUS_ALERTED。 這會模擬來自相同非特殊許可權應用程式中另一個執行緒的可能執行緒警示。
低資源模擬測試也會將錯誤插入下列 GDI 函式:EngAllocMem、EngAllocUserMem、EngCreateBitmap、EngCreateDeviceSurface、EngCreateDeviceBitmap、EngCreatePalette、EngCreateClip、EngCreatePath、EngCreateWnd、EngCreateDriverObj、BRUSHOBJ_pvAllocRbrush和CLIPOBJ_ppoGetPath。
在 Windows 7 和更新版本的 Windows 作業系統中,[低資源模擬] 選項支援使用下列核心 API 所配置的記憶體:
IoAllocateIrp 和其他可配置 I/O 要求封包的常式, (IRP) 資料結構
RtlAnsiStringToUnicodeString 和其他執行時間程式庫 (RTL) 字串常式
從 Windows 8.1 開始,[低資源模擬] 選項也會失敗呼叫 MmAllocateNodePagesForMdlEx 所要求的配置。 此外,對於某些函式,驅動程式驗證器現在會以隨機模式填滿配置的記憶體。 但只有在函式傳回未初始化記憶體的情況下。 這些函式包括:
- MmAllocatePagesForMdlEx
- MmAllocateNodePagesForMdlEx
- MmAllocateContiguousMemory
- MmAllocateContiguousMemorySpecifyCache
- MmAllocateContiguousMemorySpecifyCacheNode
- MmAllocateContiguousNodeMemory
- MmAllocateNonCachedMemory
低資源模擬的自訂設定
在 Windows Vista 和更新版本的 Windows 上,您可以指定下列自訂設定。
給定配置將會失敗的機率。 預設值為 6%。
受影響的應用程式。 此設定會將插入失敗的配置限制為指定的應用程式。 根據預設,所有配置都會受到影響。
受影響的集區標籤。 此設定會將插入的錯誤限制為具有指定集區標籤的配置。 根據預設,所有配置都會受到影響。
在 配置失敗前,) 幾分鐘內延遲 (。 此延遲可讓系統在插入錯誤之前啟動和穩定。 預設值為八分鐘。
在 Windows Vista 之前的作業系統上,您無法自訂這些設定。 作業系統會使用預設值。
低資源模擬而不重新開機
您可以在 Windows 2000 和更新版本的 Windows 上啟動低資源模擬,而不需使用 /volatile 參數重新開機電腦。 這些設定會立即生效,但如果您關閉或重新開機電腦,則會遺失。
您也可以省略 /volatile 參數,將低資源模擬設定儲存在登錄中。 只有在您重新開機電腦時,這些設定才會生效,但在您變更這些設定之前仍有效。
啟用此選項
您可以使用驅動程式驗證器管理員或Verifier.exe命令列,為一或多個驅動程式啟用低資源模擬選項。 如需詳細資訊,請參閱 選取驅動程式驗證器選項。
在命令列
在命令列中,[低資源模擬] 選項會以 位 2 (0x4) 表示。 若要啟用低資源模擬,請使用旗標值0x4或將0x4新增至旗標值。 例如:
verifier /flags 0x4 /driver MyDriver.sys
下一次開機之後,選項將會處於作用中狀態。
在 Windows Vista 和更新版本的 Windows 上,您可以使用 /faults 參數或旗標值 0x4 來啟用低資源模擬。 若要修改低資源模擬的設定,您必須使用 /faults。 例如:
verifier /faults /driver MyDriver.sys
在 Windows 2000 和更新版本的 Windows 上,您也可以啟用和停用低資源模擬,而不需將 /volatile 參數新增至 命令來重新開機電腦。 例如:
verifier /volatile /flags 0x4 /adddriver MyDriver.sys
此設定會立即生效,但會在您關閉或重新開機電腦時遺失。 如需詳細資訊,請參閱 使用變動性設定。
在 Windows Vista 上,您可以使用 /faults 參數來代表低資源模擬,並使用 /volatile 參數來代表沒有重新開機的有效設定。 將會顯示設定變更。 例如:
0> verifier /volatile /faults /adddriver MyDriver.sys New Low Resources Simulation options: - Use default fault injection probability. - Allocations using any pool tag can be failed. - Simulate low resources conditions in any application. The new settings are in effect until you restart this computer or change them again.
使用驅動程式驗證器管理員
- 啟動驅動程式驗證器管理員。 在命令提示字元視窗中輸入 驗證程式 。
- 選取 [為程式碼開發人員) 建立自訂設定 (],然後按 [ 下一步]。
- 從完整清單中選取 [選取個別設定]。
- 選取 [低資源模擬]。
自訂 Windows Vista 和更新版本的設定 ()
從 Windows Vista 開始,您可以變更 [低資源模擬] 選項之延遲、機率、應用程式和集區標籤屬性的預設設定。 您可以使用驅動程式驗證程式管理員或Verifier.exe命令列來變更這些設定。 如需詳細資訊,請參閱 選取驅動程式驗證器選項。
在命令列中,這些設定的語法如下所示:
verifier [/volatile] /faults[Probability|PoolTags|Applications|DelayMins][/driver|DriverList]
注意 自訂設定參數必須依顯示的順序顯示。 如果您省略值,請輸入引號來保留其位置。
子參數
/故障
啟用驅動程式驗證程式中的 [低資源模擬] 選項。 (您無法搭配自訂設定 subparameters.) 使用 /flags 0x4
機率
指定驅動程式驗證器將失敗指定配置的機率。 以十進位或十六進位格式輸入數位 () ,以代表驅動程式驗證程式將會失敗配置 10,000 個機率。 預設值 600 表示 600/10000 或 6%。
PoolTags
限制驅動程式驗證程式無法使用指定集區標籤配置的配置。 您可以使用萬用字元 () * 來代表多個集區標籤。 若要列出多個集區標籤,請以空格分隔標記。 根據預設,所有配置都可能會失敗。
應用程式
限制驅動程式驗證程式無法為指定程式配置的配置。 輸入可執行檔的名稱。 若要列出程式,請使用空格分隔程式名稱。 根據預設,所有配置都可能會失敗。
DelayMins
指定開機之後的分鐘數,驅動程式驗證器不會刻意失敗任何配置。 此延遲可讓驅動程式載入,並在測試開始之前穩定系統。 以十進位或十六進位格式輸入數位 () 。 預設值為 8 (分鐘) 。
例如,下列命令會啟用低資源模擬,機率為 10% (1000/10000) ,且集區標籤、Tag1 和 Fred 的延遲為 5 分鐘,以及應用程式Notepad.exe。
verifier /faults 1000 "Tag1 Fred" Notepad.exe 5
下列命令會啟用具有預設值的低資源模擬,但會將延遲延伸至 10 分鐘。
verifier /faults "" "" "" 0xa
使用驅動程式驗證器管理員
啟動驅動程式驗證器管理員。 在 [命令提示字元] 視窗中輸入 驗證程式 。
選取 [為程式碼開發人員建立自訂設定] () ,然後按 [ 下一步]。
從完整清單中選取 [選取個別設定]。
選取 [低資源模擬],然後按 [ 下一步]。
視需要變更延遲、機率、應用程式和集區標記屬性的設定。
檢視結果
您可以藉由顯示驅動程式驗證器 插入 的全域計數器來監視驅動程式驗證器刻意失敗資源配置的次數。 此計數器會顯示驅動程式驗證程式自上次開機後刻意失敗的資源配置總數。
您可以在驅動程式驗證程式記錄檔 (/log) 、命令列 (/query) 或驅動程式驗證器管理員中檢視此計數器。 在 Windows 2000 中,若要檢視全域計數器,請選取 [ 全域計數器] 索引標籤 。在較新版本的 Windows 中,選取 [顯示目前已驗證驅動程式工作的相關資訊 ],然後按 [下一步] 兩次。 如需詳細資訊,請參閱 監視全域計數器。
您也可以顯示刻意失敗的配置數目,以及使用 !verifier 偵錯工具延伸模組電腦率) 的總配置數目 (。 下列範例顯示 !verifier 輸出的範例。
在此範例中, 插入隨機低資源 API 失敗 表示已啟用低資源模擬。 資源配置失敗刻意 代表刻意失敗的配置數目,而 [嘗試的集區 配置 ] 代表配置總數。
!verifier
Verify Level 5 ... enabled options are:
Special pool
Inject random low-resource API failures
Summary of All Verifier Statistics
RaiseIrqls 0x2c671f
AcquireSpinLocks 0xca1a02
Synch Executions 0x10a623
Trims 0x0
Pool Allocations Attempted 0x862e0e
Pool Allocations Succeeded 0x8626e3
Pool Allocations Succeeded SpecialPool 0x768060
Pool Allocations With NO TAG 0x0
Pool Allocations Failed 0x34f
Resource Allocations Failed Deliberately 0x3f5
若要顯示驅動程式驗證器最近失敗之配置的堆疊追蹤,請在核心偵錯工具中使用 !verifier 4 。
下列範例顯示 !verifier 4的輸出範例。 根據預設, !verifier 4 會顯示來自四個最近失敗配置中的堆疊追蹤,但您可以使用其 Quantity 參數來增加顯示的堆疊追蹤數目。 例如,!verifier 0x80會顯示最近失敗的 128 個配置。
在此範例中,請注意,驗證器已攔截並取代驅動程式對 ExAllocatePoolWithTag的呼叫。 驅動程式嘗試配置記憶體,然後使用配置函式傳回的指標,然後確認它不是 Null時,會發生驅動程式損毀的其中一個最常見原因。
kd> !verifier 4
Resource fault injection history:
Tracker @ 8354A000 (# entries: 80, size: 80, depth: 8)
Entry @ 8354B258 (index 75)
Thread: C2638220
816760CB nt!VerifierExAllocatePoolWithTag+0x49
A4720443 win32k!bDeleteAllFlEntry+0x15d
A4720AB0 win32k!GreEnableEUDC+0x70
A47218FA win32k!CleanUpEUDC+0x37
A473998E win32k!GdiMultiUserFontCleanup+0x5
815AEACC nt!MiDereferenceSession+0x74
8146D3B4 nt!MmCleanProcessAddressSpace+0x112
815DF739 nt!PspExitThread+0x603
Entry @ 8354B230 (index 74)
Thread: 8436D770
816760CB nt!VerifierExAllocatePoolWithTag+0x49
A462141C win32k!Win32AllocPool+0x13
A4725F94 win32k!StubGdiAlloc+0x10
低資源模擬測試的體驗顯示大部分的驅動程式當機是由最近失敗的配置所造成。 在上述範例中,當機是在 win32k 的路徑中!GreEnableEUDC。 檢查配置路徑中的程式碼,以找出當機的原因。
如需 !verifier的相關資訊,請參閱 適用于 Windows 的偵錯工具 檔。
若要在命令列檢視登錄中的設定,請使用 /querysettings 選項。 例如:
C:\>verifier /querysettings
Special pool: Disabled
Pool tracking: Disabled
Force IRQL checking: Disabled
I/O verification: Disabled
Enhanced I/O verification: Disabled
Deadlock detection: Disabled
DMA checking: Disabled
Security checks: Disabled
Force pending I/O requests: Disabled
Low resources simulation: Enabled
IRP Logging: Disabled
Miscellaneous checks: Disabled
Low Resources Simulation options:
- Fault injection probability: 1/10000.
- Fail only allocations using pool tags: Tag1 Tag2.
- Simulate low resources conditions only in applications: test1.exe test2.exe.
- Boot time delay: 2 minutes.
Verified drivers:
blah.sys