共用方式為


應用程式驗證器 - 測試應用程式

應用程式驗證程式 (AppVerifier) 是非受控程式碼的執行時間驗證工具,可協助尋找細微的程式設計錯誤、安全性問題和有限的使用者帳戶許可權問題,而難以透過一般應用程式測試技術加以識別。

若要提供可靠的 Windows 應用程式:

  1. 測試以 Unmanaged (原生) 程式碼撰寫的應用程式,並在偵錯工具下使用應用程式驗證器和完整頁面堆積,再將其發行給客戶。
  2. 請遵循應用程式驗證程式所提供的步驟來解決異常狀況。
  3. 發行應用程式之後,請定期監視收集的應用程式失敗報告,例如,如果有的話,Windows 錯誤報告。

執行緒集區檢查預設會在 [基本] 檢查標題下啟用。 由於此設定包含在預設設定中,使用者只需要在其程式碼上執行應用程式驗證程式,並使用預設設定來利用這些和其他重要檢查。

設定應用程式驗證器

偵錯工具設定

正在驗證的應用程式應該在使用者模式偵錯工具下執行,或系統應該在核心偵錯工具下執行,因為它會在發生錯誤時中斷偵錯工具。 如需更多偵錯工具詳細資料,請參閱 應用程式驗證器 - 偵錯應用程式驗證器停止

設定

無法針對執行中的進程啟用應用程式驗證器。 因此,您必須依照下面所述進行設定,然後啟動應用程式。 設定是持續性的,直到明確刪除為止。 因此,無論您啟動應用程式多少次,它都會啟用 AppVerifier,直到刪除設定為止。

使用應用程式驗證器基本概念測試

下列案例說明建議的命令列和使用者介面選項。 這些應該在練習程式碼的所有測試期間執行,以確保完整涵蓋範圍。 這些案例的預期是應用程式不會中斷偵錯工具,而且所有測試都會以與未啟用 AppVerifier 的情況下執行時相同的通過率通過。

針對您想要測試的應用程式 () 啟用驗證器。 從命令列: appverif /verify MyApp.exe

從使用者介面:在 [應用程式] 區域內按一下滑鼠右鍵,然後選取 [新增應用程式],以新增您的應用程式。 從 [測試] 區域選取 [基本概念]。 按一下 [儲存] 按鈕。

注意:

/verify 會啟用基本概念測試

如果您要測試 DLL,則必須針對執行 DLL 的測試可執行檔啟用應用程式驗證程式。

個別執行驗證層。 例如,在一個會話中啟用所有基本概念,而另一個會話則會啟用所有 LuaPriv 檢查。

執行執行應用程式的所有測試。

分析遇到任何偵錯工具中斷 () 。 如果發生中斷,您必須瞭解它並加以修正。 注意:說明內容提供中斷的詳細資料,以及如何調查它們。

完成後,請刪除所有設定。 從命令列: appverif /n MyApp.exe

從使用者介面中,以滑鼠右鍵按一下 [應用程式] 區域內,然後選取 [刪除應用程式],以移除您的應用程式。 然後按一下 [儲存] 按鈕。

堆積損毀

Windows 系統上幾乎 10% 的應用程式損毀是因為堆積損毀。 這些當機在事實之後幾乎不可能進行偵錯。 避免這些問題的最佳方式是使用應用程式驗證器中找到的頁面堆積功能進行測試。 頁面堆積有兩種:「Full」 和 「Light」。Full 是預設值;它會在偵測損毀時強制偵錯工具立即停止。 此功能必須在偵錯工具下執行。 不過,這也是最需要的資源。 如果使用者遇到計時問題,且已在 [完整] 頁面堆積下執行案例,將它設定為 [淺色] 可能會解決這些問題。 此外,在進程結束之前,淺色頁面堆積不會損毀。 它會為配置提供堆疊追蹤,但比利用其完整對應專案還要長的時間進行診斷。

使用 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 分析期間建立的所有資料都會以二進位格式儲存在 %USERPROFILE%\AppVerifierLogs 資料夾中。 然後,這些記錄可以透過使用者介面或命令列轉換成 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 和 Y.DebugLevel 屬性的目標test.exe啟用兩層:

appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2

若要停用應用程式上執行的所有檢查:

appverif -disable * -for notepad.exe

OR

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 特有的屬性名稱。 例如,控制碼層具有追蹤做為 屬性。

VALUE 是 屬性的值。 值的型別取決於與 屬性相關聯的類型,而且將會強制執行。 目前支援的型別為:布林值 (true/false) 、C) 標記法中的 decimal/octal/hex 整數 (十進位/十進位/十六進位、字串和多字串 (包含 \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 (副檔名 .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,0x2701foo.exe

Appverif –configure 0x2700 0x2701 –for foo.exe –with ErrorReport=0

將停止程式碼0x2700設定為中斷偵錯工具, (預設為關閉) 、儲存沒有堆疊追蹤的記錄檔,並使其不可持續性

Appverif –configure 0x2700 –for foo.exe –with ErrorReport=0xA1 Flavor=0x2

驗證器停止選項 - 進階設定

應用程式驗證器具有進階設定,例如 Inactivate,您可以變更每個驗證器停止。

存取驗證器停止選項 - 驗證器停止選項會在列出可用選項的對話方塊中變更。 若要存取驗證器停止選項:

  1. 在 [測試] 窗格中選取測試的名稱。
  2. 在 [編輯] 功能表上,選取 [驗證器停止選項] 或以滑鼠右鍵按一下測試,然後選取 [驗證器停止選項]。

驗證器停止選項

您可以按一下停止程式碼來變更列出的下列元素,方法是按一下停止程式碼 (請注意,按一下) 時會出現停止的描述。

[非使用中] 是一個核取方塊,當選取時,將會停用驗證程式停止執行程式碼。

嚴重性會決定驗證者停止應如何加上旗標:

  • 忽略
  • 資訊
  • 警告
  • 錯誤

錯誤報表會決定您希望特定驗證程式停止回報/記錄的方式:

記錄至檔案 - 選取時會記錄到指定檔案的核取方塊。

記錄堆疊追蹤 - 選取時會記錄堆疊追蹤可用時的核取方塊。

無中斷 - 偵錯工具中不中斷的選項。

例外狀況 - 沒有中斷點和中斷點的選項

中斷點 - 選項,不含中斷或例外狀況。

其他提供兩個選項

停止一次 - 選取時只會在測試應用程式時停止該錯誤一次的核取方塊。

不可持續性 - 選取時不會允許您在不調查的情況下繼續的核取方塊。

另請參閱

應用程式驗證器 - 概觀

應用程式驗證器 - 功能

應用程式驗證器 - 應用程式驗證器內的測試

應用程式驗證器 - 停止程式碼和定義

應用程式驗證器 - 偵錯應用程式驗證器停止

應用程式驗證程式 - 常見問題