應用程式驗證器 (Windows 7 和 Windows Server 2008 R2 Application Quality Cookbook)
受影響的平臺
用戶端 - Windows XP、Windows Vista、Windows 7
伺服器 - Windows Server 2003、Windows Server 2008、Windows Server 2008 R2
描述
將應用程式驗證器提升並強制執行為所有開發的品質閘道。 其中包含數項改進:
- 我們已提供額外的檢查,以解決線程集區使用量期間 Windows 錯誤報告 小組探索到的問題。
- 我們結合 32 位和 64 位版本的套件來解決 Windows 7 中的變更,包括測試 64 位版本 Windows 下 32 位元件的需求,以及一般簡化。
- 我們已包含多線程應用程式的其他檢查、在64位 Windows 上執行32位應用程式,以及許多錯誤修正。
這些變更應該不會對未啟用線程檢查的用戶產生負面影響;那些應該在探索和診斷現有線程集區使用量問題時收到其他支持的人員。 無論您是否啟用線程檢查,您都將受益於此服務中的其他改進和錯誤修正。
雖然使用此服務時會有輕微的效能降低,但效能等級應該仍可接受,因為它通常不會在零售環境中執行。
使用方式
一般資訊
若要提供可靠的 Windows 應用程式:
- 使用調試程式下的Application Verifier測試以 Unmanaged(原生)程式代碼撰寫的應用程式,並在發行給客戶之前使用完整頁面堆積。
- 請遵循應用程式驗證器所提供的步驟來解決不限狀況。
- 發行應用程式之後,請定期監視 Windows 錯誤報告 所收集的應用程式失敗報告。
線程集區檢查預設會在 [基本] 檢查標題下啟用。 由於此設定包含在預設設定中,使用者只需要在其程式代碼上執行應用程式驗證器,並使用預設設定來利用新的檢查。
詳細資料
您至少應該執行已選取 [基本] 設定的應用程式驗證器。 這是 WinLogo 和 WinQual 的必要專案。 [基本] 設定會檢查下列各項:
- 例外狀況停止詳細 數據 - 確保應用程式不會使用結構化例外狀況處理隱藏存取違規
- 句柄停止詳細數據 - 測試以確保應用程式未嘗試使用無效的句柄
- 堆積停止詳細數據 - 檢查堆積中的記憶體損毀問題
- 輸入/輸出停止詳細數據 - 監視異步 IO 的執行,並執行各種驗證
- 洩漏停止詳細數據 - 追蹤 dll 卸除時未釋放的 dll 所建立的資源,以偵測流失
- 鎖定停止詳細數據 - 驗證重要區段的正確使用方式
- 記憶體停止詳細數據 - 確保正確使用虛擬空間操作的 API(例如 VirtualAlloc、MapViewOfFile)
- TLS 停止詳細資料 - 確保正確使用線程本機記憶體 API
- 線程集區停止詳細數據 - 確保線程集區 API 的正確使用方式,並在回呼之後對背景工作線程狀態強制執行一致性檢查
如果您的應用程式是從「Pre-Vista」應用程式移轉,您會想要利用 “LuaPriv” (也稱為 UAC 檢查)。 有限的使用者帳戶許可權預測器 (LuaPriv) 有兩個主要目標:
- 預測性:以系統管理許可權執行應用程式時,如果以較少的許可權執行,則預測該應用程式是否正常運作(通常是一般使用者)。 例如,如果應用程式寫入只允許系統管理員存取的檔案,則當以非系統管理員身分執行時,該應用程式將無法寫入相同的檔案。
- 診斷:以非系統管理員許可權執行時,找出目前執行可能已經存在的潛在問題。 繼續上述範例,如果應用程式嘗試寫入僅授與系統管理員群組成員存取權的檔案,應用程式將會收到ACCESS_DENIED錯誤。 如果應用程式無法正確運作,此作業可能是罪魁禍首。
LuaPriv 可識別下列類型的問題:
潛在問題 | 說明 |
---|---|
受限制的命名空間 | 在沒有命名空間的情況下建立具名同步處理物件 (Event、Semaphore、Mutex 等),可能會使某些操作系統在沒有許可權的情況下執行時複雜,因為操作系統可能會選擇將物件放在受限制的命名空間中。 在受限制的命名空間中建立這類物件(例如全域命名空間)需要只授與系統管理員的 SeCreateGlobalPrivilege。 如果 LuaPriv 偵測到這些問題,則會標幟這兩個問題。 |
硬式系統管理員檢查 | 有些應用程式會詢問使用者的安全性令牌,以瞭解他/她擁有多少許可權。 在這些情況下,應用程式可能會根據其認為用戶擁有多少權力來變更其行為。 LuaPriv 旗標會傳回這項資訊的 API 呼叫。 |
要求許可權 | 在執行需要安全性的作業之前,應用程式可能會嘗試啟用安全性相關許可權(例如 SeTcbPrivilege 或 SeSecurityPrivilege)。 LuaPriv 旗標嘗試啟用安全性相關許可權。 |
遺漏許可權 | 如果應用程式嘗試啟用使用者沒有的許可權,它可能會發出應用程式預期許可權的訊號,這可能會造成行為差異。 LuaPriv 旗標失敗的許可權要求。 |
INI-File 作業 | 嘗試寫入對應的 INI 檔案(WritePrivateProfileSection 和類似的 API)可能會因為非系統管理員用戶而失敗。 LuaPriv 會標幟這類作業。 |
拒絕存取 | 如果應用程式嘗試存取物件(檔案、登錄機碼等),但嘗試因為存取不足而失敗,則應用程式可能會預期執行的許可權比它擁有的更多許可權。 LuaPriv 會標幟對象開啟嘗試,但失敗並出現ACCESS_DENIED和類似的錯誤。 |
拒絕 ACE | 如果物件在其 DACL 中有 Deny ACE,則會明確拒絕存取特定實體。 這是罕見的,並使得預測變得困難,因此 LuaPriv 旗標拒絕 ACE 時發現它們。 |
存取受限 | 如果應用程式嘗試針對未授與一般使用者的許可權開啟物件(例如,嘗試寫入只有系統管理員可寫入的檔案),則當以一般使用者身分執行時,應用程式可能無法運作。 LuaPriv 會標幟這類作業。 |
MAXIMUM_ALLOWED | 如果應用程式開啟MAXIMUM_ALLOWED的物件,則對象的實際存取檢查將會發生在其他地方。 執行這項作業的大部分程式代碼都無法正確運作,而且在不使用許可權執行時,幾乎肯定會以不同的方式運作。 因此,LuaPriv 會標幟所有MAXIMUM_ALLOWED事件。 |
常見的忽略問題會在模糊的 Misc 檢查中擷取:
- 危險 API 停止詳細數據
- 髒堆疊停止詳細數據
- 時間變換
我們已新增列印驗證器。 此層可協助尋找並針對應用程式呼叫列印子系統時可能造成的問題進行疑難解答。 列印驗證器的目標是列印子系統的兩個層:PrintAPI 層和 PrintDriver 層。
列印 API 層
列印驗證程式會測試程式與 Winspool.drv 之間的介面,並prntvpt.dll測試這些 DLL 的介面。
列印驅動程式層
列印驗證器也會測試核心列印驅動程式之間的介面,例如UNIDRV.DLL、UNIDRUI.DLL、PSCRIPT5.DLL、PS5UI.DLL或MXDWDRV.DLL,以及列印驅動程式外掛程式外掛程式。
請注意,有些檢查僅適用於 Windows 7,有些檢查只會在 Windows 7 下執行得更好。
一般而言,只有偵錯版本會執行應用程式驗證器,因此效能通常不是問題。 如果使用此檢查或任何其他應用程式驗證程式檢查時發生效能問題,請一次執行一次檢查,直到您執行所有必要的檢查為止。
Windows 系統上近 10% 的應用程式損毀是由於堆積損毀。 事實發生后,這些損毀幾乎無法偵錯。 避免這些問題的最佳方式是使用應用程式驗證器中找到的頁面堆積功能進行測試。 頁面堆積有兩種口味:“Full” 和 “Light”。Full 是預設值;它會強制調試程式在偵測損毀時立即停止。 此功能必須在調試程式下執行。 不過,這也是最需要資源的資源。 如果使用者遇到計時問題,且已在 [完整] 頁面堆積下執行案例,則將其設定為 “Light” 可能會解決這些問題。 此外,在進程結束之前,淺色頁面堆積不會當機。 它確實為配置提供堆疊追蹤,但診斷時間可能會比利用其完整對應項目還要長得多。
透過 Winqual 入口網站監視應用程式的可靠性狀態。 此入口網站會顯示透過 Windows 錯誤報告 收集的錯誤報告,因此很容易識別最常見的失敗。 在 Windows 錯誤報告:用戶入門中瞭解這一點。 Microsoft不收取此服務的費用。
若要利用 WinQual,您必須:
- 向 WinQual 註冊您的公司,這需要 VeriSign 識別碼。 您可以在 Windows Vista SP1 \ Windows Server 2008 下分組的開發人員入口網站中找到 WinQual 的相關信息。 它很快就會有 Windows 7 位置。
- 將ISV應用程式對應至產品名稱和ISV名稱,將失敗報告連結至公司。 其他ISV無法檢視您的錯誤報告。
- 使用入口網站來識別常見問題。 ISV 也可以建立回應,告知客戶在失敗後採取哪些步驟。 回應系統在全球支持超過10種語言。
另一個注意事項:應用程式驗證器只和您針對它執行的程式代碼路徑一樣好。 結合此工具與程式代碼涵蓋範圍工具的值無法過度表示。
其他資源的連結
適用於 Windows 的偵錯工具:
應用程式驗證器:
Microsoft Visual Studio 2008/.NET Framework 3.5 的應用程式驗證器
注意: Visual Studio 中隨附的應用程式驗證器版本相當日期。 可能的話,請改用獨立套件。 因此,未來的Visual Studio版本將不再有內嵌的應用程式驗證器。
WinQual: