Application Verifier (Windows 7 e Windows Server 2008 R2 Application Quality Cookbook)

Piattaforme interessate

Client - Windows XP, Windows Vista, Windows 7
Servers - Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Descrizione

Promuovere e applicare Application Verifier come controllo di qualità per tutto lo sviluppo. Include diversi miglioramenti:

  • Sono stati forniti controlli aggiuntivi per risolvere i problemi individuati dal team Segnalazione errori Windows durante l'utilizzo del pool di thread.
  • Sono state combinate versioni a 32 e a 64 bit del pacchetto per risolvere le modifiche in Windows 7, incluse le esigenze di test dei componenti a 32 bit in una versione a 64 bit di Windows, nonché per la semplificazione generale.
  • Sono stati inclusi controlli aggiuntivi per le applicazioni multithreading, che eseguono applicazioni a 32 bit in Windows a 64 bit, nonché molte correzioni di bug.

Queste modifiche non devono avere alcun impatto negativo sugli utenti che non abilitano i controlli dei thread; coloro che devono ricevere supporto aggiuntivo per l'individuazione e la diagnosi dei problemi di utilizzo del pool di thread esistenti. Indipendentemente dal fatto che si abiliti o meno i controlli dei thread, si trarranno vantaggio dagli altri miglioramenti e correzioni di bug in questo servizio.

Anche se si verifica una lieve riduzione delle prestazioni quando si usa questo servizio, i livelli di prestazioni devono rimanere accettabili perché in genere non vengono eseguiti in ambienti di vendita al dettaglio.

Utilizzo

Informazioni generali

Per offrire applicazioni Windows affidabili:

  1. Testare le applicazioni scritte in codice non gestito (nativo) con Application Verifier nel debugger e con heap a pagina intera prima di rilasciarla ai clienti.
  2. Seguire i passaggi forniti da Application Verifier per risolvere le condizioni inquieti.
  3. Dopo il rilascio dell'applicazione, monitorare regolarmente i report degli errori dell'applicazione raccolti da Segnalazione errori Windows.

I controlli del pool di thread sono abilitati per impostazione predefinita sotto l'intestazione di controllo "Informazioni di base". Poiché questa opzione è inclusa nell'impostazione predefinita, gli utenti devono eseguire Application Verifier solo nel codice con le impostazioni predefinite per sfruttare i nuovi controlli.

Dettagli

Come minimo, è necessario eseguire Application Verifier con l'impostazione Informazioni di base selezionata. Questa operazione è necessaria per WinLogo e WinQual. L'impostazione Informazioni di base controlla quanto segue:

  • Eccezioni Arresta dettagli - Assicura che le applicazioni non nascondono violazioni di accesso usando la gestione strutturata delle eccezioni
  • Gestisce i dettagli di arresto: verifica che l'applicazione non tenti di usare handle non validi
  • Dettagli arresto heap - Verifica la presenza di problemi di danneggiamento della memoria nell'heap
  • Dettagli interruzione input/output - Monitora l'esecuzione di operazioni di I/O asincrone ed esegue varie convalide
  • Dettagli interruzione perdita: rileva le perdite monitorando le risorse effettuate da una DLL che non vengono liberate dal momento in cui la dll è stata scaricata
  • Blocchi - Verifica l'utilizzo corretto per le sezioni critiche
  • Dettagli arresto memoria - Assicura che le API per le manipolazioni dello spazio virtuale vengano usate correttamente (ad esempio, VirtualAlloc, MapViewOfFile)
  • Dettagli arresto TLS: garantisce che le API di Archiviazione locali del thread vengano usate correttamente
  • Dettagli arresto threadpool : garantisce l'uso corretto delle API del pool di thread e applica i controlli di coerenza sugli stati del thread di lavoro dopo un callback

Se l'applicazione esegue la migrazione da un'applicazione "Pre-Vista", è consigliabile usare "LuaPriv" (nota anche come controlli di controllo dell'account utente). Il predictor dei privilegi dell'account utente limitato (LuaPriv) ha due obiettivi principali:

  • Predittivo: durante l'esecuzione di un'applicazione con privilegi amministrativi, prevedere se l'applicazione funzionerebbe anche se l'esecuzione con privilegi inferiori (in genere, come utente normale). Ad esempio, se l'applicazione scrive in file che consentono solo l'accesso Amministrazione istrators, tale applicazione non sarà in grado di scrivere nello stesso file se eseguito come non amministratore.
  • Diagnostica: durante l'esecuzione con privilegi non di amministratore, identificare potenziali problemi che potrebbero esistere già con l'esecuzione corrente. Continuando l'esempio precedente, se l'applicazione tenta di scrivere in un file che concede solo l'accesso ai membri del gruppo Amministrazione istrator, l'applicazione riceverà un errore ACCESS_DENIED. Se l'applicazione non funziona correttamente, questa operazione può essere il colpevole.

LuaPriv identifica i tipi di problemi seguenti:

Potenziale problema Descrizione
Spazi dei nomi con restrizioni La creazione di un oggetto di sincronizzazione denominato (Event, Semaphore, Mutex e così via) senza uno spazio dei nomi può complicare l'esecuzione senza privilegi per alcuni sistemi operativi perché il sistema operativo può scegliere di inserire l'oggetto in uno spazio dei nomi con restrizioni. La creazione di un oggetto di questo tipo in uno spazio dei nomi con restrizioni ,ad esempio lo spazio dei nomi Globale, richiede SeCreateGlobalPrivilege, che viene concesso solo agli amministratori.
LuaPriv contrassegna entrambi questi problemi se li rileva.
Controlli hard Amministrazione istrator Alcune applicazioni interrogano il token di sicurezza dell'utente per scoprire quanti privilegi ha. In questi casi, l'applicazione può modificarne il comportamento a seconda della potenza che ritiene che l'utente abbia.
Le chiamate API luaPriv flags che restituiscono queste informazioni.
Richiesta di privilegi Un'applicazione può tentare di abilitare un privilegio rilevante per la sicurezza, ad esempio SeTcbPrivilege o SeSecurityPrivilege, prima di eseguire un'operazione che lo richiede.
I flag LuaPriv tentano di abilitare privilegi rilevanti per la sicurezza.
Privilegi mancanti Se un'applicazione tenta di abilitare un privilegio che l'utente non ha, probabilmente segnala che l'applicazione prevede il privilegio, che può causare differenze di comportamento.
Flag LuaPriv non riuscite richieste di privilegi.
Operazioni INI-File I tentativi di scrittura nei file INI mappati (WritePrivateProfileSection e API simili) possono non riuscire come utente non amministratore.
LuaPriv contrassegna tali operazioni.
Accesso negato Se l'applicazione tenta di accedere a un oggetto (File, chiave del Registro di sistema e così via), ma il tentativo ha esito negativo a causa di un accesso insufficiente, l'applicazione probabilmente prevede l'esecuzione con più privilegi rispetto a quanto previsto.
LuaPriv contrassegna i tentativi di apertura dell'oggetto che hanno esito negativo con errori ACCESS_DENIED e simili.
Nega ACL Se un oggetto dispone di ACL nega nell'elenco di controllo di accesso, nega in modo esplicito l'accesso a entità specifiche.
Questa situazione non è comune e rende difficile la stima, quindi LuaPriv contrassegna Nega gli ACL quando li trova.
Accesso con limitazioni Se un'applicazione tenta di aprire un oggetto per i diritti che non vengono concessi agli utenti normali (ad esempio, provando a scrivere in un file che è scrivibile solo dagli amministratori), l'applicazione probabilmente non funzionerà come un utente normale.
LuaPriv contrassegna tali operazioni.
MAXIMUM_ALLOWED Se un'applicazione apre un oggetto per MAXIMUM_ALLOWED, il controllo di accesso effettivo sull'oggetto verrà eseguito altrove. La maggior parte del codice che esegue questa operazione non funziona correttamente e funziona quasi certamente in modo diverso quando viene eseguita senza privilegi.
LuaPriv contrassegna quindi tutti gli eventi imprevisti di MAXIMUM_ALLOWED.

 

I problemi comunemente trascurati vengono acquisiti nei controlli misc nebulosi:

  • Dettagli di arresto delle API pericolose
  • Dettagli arresto stack dirty
  • Rollover dell'ora

È stato aggiunto un nuovo verifier di stampa. Questo livello consente di trovare e risolvere i problemi che possono verificarsi quando un'applicazione chiama il sottosistema di stampa. Print Verifier è destinato ai due livelli del sottosistema di stampa, il livello PrintAPI e il livello PrintDriver.

Livello API di stampa

Print Verifier verifica l'interfaccia tra un programma e Winspool.drv e prntvpt.dll e testa le interfacce di tali DLL. È possibile esaminare le regole per chiamare le funzioni in questa interfaccia nella sezione della Guida MSDN per le API esportate da winspool.drv e prntvpt.dll.

Livello driver di stampa

Print Verifier testa anche l'interfaccia tra un driver di stampa principale, ad esempio UNIDRV.DLL, UNIDRUI.DLL, PSCRIPT5.DLL, PS5UI.DLL o MXDWDRV.DLL e i plug-in del driver di stampa. Per informazioni su questa interfaccia, vedere MSDN e WDK.

Tieni presente che alcuni di questi controlli sono solo per Windows 7 e altri eseguiranno semplicemente prestazioni migliori in Windows 7.

In genere, solo le versioni di debug eseguono Application Verifier, quindi le prestazioni non sono in genere un problema. Se si verificano problemi di prestazioni dall'uso di questo o da qualsiasi altro controllo di Verifica applicazione, eseguire un controllo alla volta fino a quando non sono stati eseguiti tutti i controlli necessari.

Quasi il 10% degli arresti anomali delle applicazioni nei sistemi Windows è dovuto al danneggiamento dell'heap. Questi arresti anomali sono quasi impossibili da eseguire dopo il debug. Il modo migliore per evitare questi problemi consiste nel testare le funzionalità heap della pagina disponibili in Application Verifier. Esistono due tipi di Heap pagina: "Full" e "Light". Full è il valore predefinito; forza l'arresto istantaneo di un debugger al rilevamento del danneggiamento. Questa funzionalità DEVE essere eseguita nel debugger. Tuttavia, è anche la più impegnativa risorsa. Se un utente presenta problemi di intervallo e ha già eseguito uno scenario nell'heap di pagina "Completo", impostandolo su "Light" probabilmente risolverà questi problemi. Inoltre, l'heap pagina leggera non si arresta in modo anomalo fino all'uscita del processo. Fornisce un'analisi dello stack all'allocazione, ma può richiedere molto più tempo per diagnosticare rispetto all'uso della controparte Completa.

Monitorare lo stato di affidabilità delle applicazioni tramite il portale Web Winqual. Questo portale mostra i report degli errori raccolti tramite Segnalazione errori Windows, quindi è facile identificare gli errori più frequenti. Per altre informazioni, vedere Segnalazione errori Windows: Introduzione. Microsoft non addebita alcun addebito per questo servizio.

Per sfruttare i vantaggi di WinQual, è necessario:

  1. Registrare la società per WinQual, che richiede un ID VeriSign. È possibile trovare informazioni su Windows 7 su WinQual nel portale per sviluppatori raggruppate in Windows Vista SP1 \ Windows Server 2008. Avrà presto una posizione di Windows 7.
  2. Eseguire il mapping delle applicazioni ISV a un nome di prodotto e al nome ISV, che collega le segnalazioni di errori all'azienda. Altri ISV non possono visualizzare i report degli errori.
  3. Usare il portale per identificare i problemi principali. Gli ISV possono anche creare risposte che informano i clienti dei passaggi da eseguire dopo un errore. Il sistema di risposta supporta oltre 10 lingue in tutto il mondo.

Un'altra nota: Application Verifier è valida solo per i percorsi di codice su cui viene eseguito. Il valore della combinazione di questo strumento con uno strumento di code coverage non può essere superato.

Strumenti di debug per Windows:

Application Verifier:

WinQual: