應用程式驗證器 -測試應用程式
應用程式驗證器 (AppVerifier) 是 Unmanaged 程式代碼的運行時間驗證工具,可協助找出細微的程式設計錯誤、安全性問題和有限的使用者帳戶許可權問題,而無法透過一般應用程式測試技術來識別。
若要提供可靠的 Windows 應用程式:
- 使用調試程式下的Application Verifier測試以 Unmanaged(原生)程式代碼撰寫的應用程式,並在發行給客戶之前使用完整頁面堆積。
- 請遵循應用程式驗證器所提供的步驟來解決不限狀況。
- 發行您的應用程式之後,請定期監視收集的應用程式失敗報告,例如,如果有的話,Windows 錯誤報告。
線程集區檢查預設會在 [基本] 檢查標題下啟用。 由於此設定包含在預設設定中,使用者只需要使用預設設定在其程式代碼上執行應用程式驗證器,才能利用這些和其他重要檢查。
設定應用程式驗證器
調試程序設定
正在驗證的應用程式應該在使用者模式調試程式下執行,或者系統應該在核心調試程式下執行,因為它會在發生錯誤時中斷調試程式。 如需更多調試程式詳細數據,請參閱 應用程式驗證器 - 偵錯應用程式驗證器停止。
設定
無法針對執行中的進程啟用應用程式驗證器。 因此,您必須如以下所述進行設定,然後啟動應用程式。 這些設定會持續到明確刪除為止。 因此,無論您啟動應用程式多少次,啟動應用程式都會啟用AppVerifier,直到刪除設定為止。
使用應用程式驗證器基本概念測試
下列案例說明建議的命令行和使用者介面選項。 這些應該在練習程式代碼的所有測試期間執行,以確保完整的涵蓋範圍。 這些案例的預期是,應用程式不會中斷調試程式,而且所有測試都會以與未啟用AppVerifier的情況下執行時相同的通過率通過。
針對您想要測試的應用程式啟用驗證器。 從命令列:appverif /verify MyApp.exe
。
從使用者介面:以滑鼠右鍵按兩下 [應用程式] 區域內,然後選取 [新增應用程式],以新增您的應用程式。 從 [測試] 區域選擇 [基本] 。 按一下 [儲存] 按鈕。
筆記:
/verify 將會啟用基本概念測試
如果您要測試 DLL,則必須為執行 DLL 的測試可執行檔案啟用應用程式驗證器。
個別執行驗證層。 例如,在一個會話中啟用所有基本概念,在另一個會話中,會啟用所有 LuaPriv 檢查。
執行所有執行應用程式的測試。
分析所遇到的任何調試程序中斷。 如果中斷發生,您必須瞭解並加以修正。 注意:說明內容會提供中斷的詳細數據,以及如何調查它們。
完成後,請刪除所有設定。 從命令列:appverif /n MyApp.exe
。
從使用者介面中,以滑鼠右鍵按兩下 [應用程式] 區域內,然後選取 [刪除應用程式],以移除您的應用程式。 然後按下 [儲存] 按鈕。
堆積損毀
Windows 系統上近 10% 的應用程式損毀是由於堆積損毀。 事實發生后,這些損毀幾乎無法偵錯。 避免這些問題的最佳方式是使用應用程式驗證器中找到的頁面堆積功能進行測試。 頁面堆積有兩種口味:“Full” 和 “Light”。Full 是預設值;它會強制調試程式在偵測損毀時立即停止。 此功能必須在調試程式下執行。 不過,這也是最需要資源的資源。 如果使用者遇到計時問題,且已在 [完整] 頁面堆積下執行案例,則將其設定為 “Light” 可能會解決這些問題。 此外,在進程結束之前,淺色頁面堆積不會當機。 它確實為配置提供堆疊追蹤,但診斷時間可能會比利用其完整對應項目還要長得多。
使用 AppVerifier 低資源模擬 (錯誤插入)
此案例的預期是應用程式不會中斷至調試程式。 若未中斷調試程式,表示您不需要解決任何錯誤。
測試的通過率可能會大幅降低,因為隨機錯誤插入會引入一般作業。
為應用程式啟用應用程式驗證器低資源模擬(錯誤插入)。 從命令列:Appverif /verify MyApp.exe /faults
。 從使用者介面:在 [應用程式] 區域內單擊滑鼠右鍵,然後選取 [新增應用程式] 來新增您的應用程式。 從 [測試] 區域選取 [低資源模擬]。 按一下 [儲存] 按鈕。
注意:如果您正在測試 DLL,您可以在特定 DLL 上套用低資源模擬(錯誤插入),而不是整個程式。 命令列格式為:
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]
範例:
appverif /verify mytest.exe /faults 50000 1000 d3d9.dll
執行執行應用程式的所有測試
分析所遇到的任何調試程序中斷。 如果中斷發生,您必須瞭解並加以修正。
完成後,請刪除所有設定。 從命令列:appverif /n MyApp.exe。 從使用者介面:以滑鼠右鍵按兩下 [應用程式] 區域內,然後選取 [刪除應用程式],然後按兩下 [儲存] 按鈕,以移除您的應用程式。
注意:在應用程式中執行與不使用錯誤插入練習基本上不同的程式代碼路徑,因此必須執行這兩個案例,才能取得 AppVerifier 的完整優點。
搭配 WOW64 使用應用程式驗證器
您可以使用 32 位或 64 位版本的應用程式驗證器來驗證在 WOW64 下執行的 32 位應用程式。
分析 AppVerifier 數據
在 AppVerifier 分析期間建立的所有資料都會以二進位格式儲存在 \AppVerifierLogs 資料夾中 %USERPROFILE%。 然後,這些記錄可以透過使用者介面或命令行轉換成 XML,以便進一步分析。
若要檢視 XML 檔案,您可以使用任何工具來檢視 XML,例如匯入至 Microsoft Excel - 將 XML 檔案匯入至 Excel,並使用篩選或數據透視表來重新組織及分析收集的數據。
使用命令行
應用程式驗證器可以透過UI或使用命令列選項來使用。
以下是如何使用命令列的範例(以下是詳細資料):
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]
appverif /verify notepad
appverif -enable LAYER … -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …]
appverif -disable LAYER ... -for TARGET ...
appverif -query LAYER ... -for TARGET ...
appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]
appverif –logtofile {enable|disable}
若要為兩個應用程式啟用特定驗證層的應用程式驗證器:
appverif –enable Heaps Locks –for notepad.exe iexplore.exe
若要針對具有 X.DebugLevel 和 Y.DebugLevel 屬性的目標 test.exe 啟用兩個名為 X 和 Y 的層次:
appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2
若要停用應用程式上執行的所有檢查:
appverif -disable * -for notepad.exe
或者
appverif -delete settings -for notepad.exe
若要全域啟用或停用所有行程的應用程式驗證器記錄:
appverif –logtofile enable
appverif –logtofile disable
預設會為所有進程啟用記錄。
應用程式驗證器命令列語法
應用程式驗證器命令列使用方式:
-enable TEST ... -for TARGET ... [-with [TEST.]PROPERTY=VALUE ...]
-disable TEST ... -for TARGET ...
-query TEST ... -for TARGET ...
-configure STOP ... -for TARGET ... -with PROPERTY=VALUE...
-verify TARGET [-faults [PROBABILITY [TIMEOUT [DLL ...]]]]
-export log -for TARGET -with To=XML_FILE [Symbols=SYMBOL_PATH] [StampFrom=LOG_STAMP] [StampTo=LOG_STAMP] [Log=RELATIVE_TO_LAST_INDEX]
-delete {logs|settings} -for TARGET ...
-stamp log -for TARGET -with Stamp=LOG_STAMP [Log=RELATIVE_TO_LAST_INDEX]
-logtoxml LOGFILE XMLFILE
-installprovider PROVIDERBINARY
-sppath [PROTECTED_PROCESS_LOG_PATH]
-cppath
-logtofile [enable | disable]
命令行語法接受一或多個圖層,並使用圖層的選擇性屬性規範將其套用至一或多個目標。
appverif -enable LAYER ... -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …]
appverif -disable LAYER ... -for TARGET ...
appverif -query LAYER ... -for TARGET ...
appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]
地點:
LAYER 是驗證層的標準名稱。 如果已安裝新的驗證器提供者,這會公開命令行中要使用的新驗證層名稱。 範例圖層為堆積、句柄或鎖定。
您可以將 LAYER 設定為 * ,以指定命令會套用至所有層次。
TARGET 是二進位名稱(例如 notepad.exe)。 這是保存在登錄中的靜態設定,每當啟動應用程式時,都會納入考慮。 針對 appverif –disable 命令,您可以將 TARGET 設定為 * ,以指定應該停用所有目標。
PROPERTY 是命令行中所提及之 LAYER 特有的屬性名稱。 例如,Handles 層具有追蹤做為 屬性。
VALUE 是 屬性的值。 值的型別取決於與 屬性相關聯的型別,而且將會強制執行。 目前支援的型別為:布爾值(true/false)、整數(C 表示法中的十進位/八進位/十六進位)、字串串和多字元串(包含 \0’ between strings and being terminated by
\0\0')。 如果未指定 VALUE,則表示使用者想要刪除該屬性,並將行為還原為 屬性的預設值。
STOP 是要設定之驗證器停止問題的數位(C 表示法中的十進位或十六進位)。 停止代碼必須是唯一的(沒有兩個圖層可以使用相同的停止代碼,因此工具本身將決定停止所屬的圖層)
STOPPROPERTY 是驗證器停止可接受的屬性名稱。 如果未指定值,則會假設必須刪除 屬性。 停止的允許屬性為 (如需詳細資訊,請參閱下方的設定驗證器停止):
- ErrorReport
- 嚴重程度
- 味道
屬性可由其所屬的圖層選擇性限定。 不過,如果命令行只啟用一層,就不需要這樣做。 例如,若要針對目標 test.exe 啟用名為 X 和 Y 的兩個圖層,且屬性為 X.DebugLevel 和 Y.DebugLevel,命令為:
appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2
不過,如果已啟用第 X 層,則可以使用不合格的屬性名稱:
appverif –enable X –for test.exe –with DebugLevel=1
屬性名稱和值之間的分隔符可以是 =
(等號)或 :
(冒號)。
其他命令
appverif –query providers
appverif –delete logs –for TARGET ...
appverif –delete settings –for TARGET ...
從登錄清除完全 TARGET。
appverif –stamp log –for Target –with Stamp=”LOG_STAMP”[Log= RELATIVE_TO_LAST_INDEX]
此命令會將記錄加上LOG_STAMP戳記。 此戳記對於在 XML 窗體中檢視記錄檔時,只識別記錄檔的區段很有用。
appverif –export log –for TARGET –with To=XML_FILE[Symbols=SYMBOL_PATH][Stamp=LOG_STAMP][StampTo=LOG_STAMP][Log=RELATIVE_TO_LAST_INDEX]
上述命令會將二進位記錄檔導出至 xml 檔案。 選擇性的 Stamp 屬性是用來識別記錄的哪個部分應該匯出至 XML。 如果未指定,則會轉換整個記錄檔。 Log 屬性具有可能的負整數值,並表示應該從最後一個記錄檔開始轉換哪些記錄檔(假設屬性不存在的話)。 例如,連續三次啟動 notepad.exe。 若要存取第一個建立的記錄檔,請在命令行中指定Log=-2。
命令行的快捷方式
以下是快捷方式:
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]
地點:
TARGET 的意義與上述相同。
PROBABILITY 是插入錯誤的機率。 必須是範圍 0..10000000 中的值。 如果未指定,則預設值為 5%。
TIMEOUT 是在錯誤插入未發生時,進程啟動期間以毫秒為單位的時間間隔。 這樣做可讓程式在發生錯誤之前正確啟動。 如果未指定,則值為 500 毫秒。
DLL 是在進程中載入的模組名稱。 一般而言,這是動態連結庫的名稱(延伸模組 .dll),但可以是 ActiveX(extension .ocx)或其他可載入的模組。
範例:
appverif /verify notepad.exe /faults 100000 1000 msvcrt.dll
啟用 notepad.exe 的錯誤插入(每當啟動時)。 錯誤應該會發生機率 10%,在啟動進程之後,只有 1000 毫秒,而且僅適用於從 msvcrt.dll起始的作業。
啟用錯誤插入詳細數據
使用 /faults 命令行只會針對OLE_ALLOC和HEAP_ALLOC啟用錯誤插入。 不過,您可以使用命令行來設定您要開啟的錯誤插入類型。 例如,如果您想要將錯誤插入登錄或檔案 API 作為 2%,請使用命令列:
appverif -enable lowres -for hello.exe -with registry=20000 file=20000
另一個範例:
appverif -query lowres -for hello.exe
Settings for hello.exe:
Test [lowres] enabled.
Include = *
Exclude =
TimeOut = 2000 (0x7D0)
WAIT = 0 (0x0)
HEAP_ALLOC = 20000 (0x4E20)
VIRTUAL_ALLOC = 0 (0x0)
REGISTRY = 20000 (0x4E20)
FILE = 20000 (0x4E20)
EVENT = 0 (0x0)
MAP_VIEW = 0 (0x0)
OLE_ALLOC = 20000 (0x4E20)
STACKS = false
設定驗證器停止
您可以使用命令列 (或使用者介面) 來設定驗證器停止。 以下是運用的範例:
Appverif -configure STOP ... -for TARGET ... -with PROPERTY=VALUE ...
STOP 是停止程式代碼,例如0x200 0x201
TARGET 是應用程式名稱,例如 foo.exe
PROPERTY 可以是其中一個 “ErrorReport”、“Severity” 和 “Flavor”
針對 ErrorReport ,VALUE 可以是下列值的組合。
0x00000001表示停止作用中。 (如果這個位為零,表示停止已停用)
0x00000020表示停止會使用斷點進入調試程式。
0x00000040表示停止中斷調試程式,方法是產生驗證器例外狀況。
0x00000080表示停止將會記錄在記錄檔中。
0x00000100表示此停止的堆疊追蹤將會記錄在記錄檔中。
針對嚴重性 ,VALUE 可以是下列其中一項。
0x00000003資訊停止。
0x0000000F警告。
0x0000003F錯誤。
針對 Flavor ,Value 可以是下列值的組合。
0x00000002非持續性停止。
0x00000010此停止只會顯示一次。 在測試回合內,將會忽略下列時間。
例如,停用停止0x2700,0x2701 foo.exe
Appverif –configure 0x2700 0x2701 –for foo.exe –with ErrorReport=0
將停止程式代碼0x2700設定為中斷調試程式(預設為關閉)、儲存沒有堆疊追蹤的記錄檔,並使它不可持續性
Appverif –configure 0x2700 –for foo.exe –with ErrorReport=0xA1 Flavor=0x2
驗證器停止選項 - 進階設定
應用程式驗證器具有進階設定,例如 Inactivate,您可以變更每個驗證器停止。
Access Verifier Stop Options - 驗證器停止選項會在列出可用選項的對話框中變更。 若要存取驗證器停止選項:
- 在 [測試] 窗格中選取測試的名稱。
- 在 [編輯] 功能表上,選取 [驗證器停止選項] 或以滑鼠右鍵按鍵按兩下測試,然後選取 [驗證器停止選項]。
驗證器停止選項
您可以按下停止代碼來改變每個驗證器所列出的下列元素(請注意,按兩下時會出現停止的描述)。
[非使用中] 是複選框,當選取時,將會停用驗證程式停止程式代碼執行。
嚴重性會決定驗證器停止應如何加上旗標:
- 忽視
- 資訊
- 警告
- 錯誤
錯誤報告會決定您希望特定驗證程式停止報告/記錄的方式:
記錄至檔案 - 選取時將記錄到指定檔案的複選框。
記錄堆疊追蹤 - 選取時會記錄堆疊追蹤的複選框。
無中斷 - 不在調試程式中中斷的選項。
例外狀況 - 沒有斷點和斷點的選項
斷點 - 沒有中斷或例外狀況的選項。
其他提供兩個選項
停止一次 - 選取時只會在測試應用程式時停止該錯誤一次的複選框。
不可持續性 - 選取時不允許您繼續而不調查的複選框。