Verificador de Aplicações (Windows 7 e Windows Server 2008 R2 Application Quality Cookbook)

Plataformas Afetadas

Clientes - Windows XP, Windows Vista, Windows 7
Servidores - Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Descrição

Promover e aplicar o Application Verifier como uma porta de qualidade para todo o desenvolvimento. Inclui várias melhorias:

  • Realizámos verificações adicionais para resolver problemas que a equipa de Relatórios de Erros do Windows detetou durante a utilização do pool de threads.
  • Combinámos versões de 32 e 64 bits do pacote para responder a alterações no Windows 7, incluindo a necessidade de testar componentes de 32 bits numa versão de 64 bits do Windows, bem como para simplificação geral.
  • Incluímos verificações adicionais para aplicações multithread, executando aplicações de 32 bits no Windows de 64 bits, bem como muitas correções de bugs.

Estas alterações não devem ter impacto negativo nos utilizadores que não ativam as Verificações de Thread; Quem o fizer deve receber apoio adicional na descoberta e diagnóstico de problemas existentes de utilização do pool de threads. Quer atives ou não as Verificações de Thread, vais beneficiar das outras melhorias e correções de bugs deste serviço.

Embora exista uma ligeira penalização de desempenho ao utilizar este serviço, os níveis de desempenho devem manter-se aceitáveis porque normalmente não funciona em ambientes de retalho.

Utilização

Informação Geral

Para entregar aplicações Windows fiáveis:

  1. Aplicações de teste escritas em código não gerido (nativo) com o Application Verifier sob o depurador e com heap de página inteira antes de serem disponibilizados aos clientes.
  2. Siga os passos fornecidos pelo Application Verifier para resolver condições erradas.
  3. Depois de a sua aplicação ser lançada, monitorize regularmente os relatórios de falhas da aplicação recolhidos pelo Windows Error Reporting.

As verificações do pool de threads estão ativadas por defeito sob o título de verificação "Basics". Como isto está incluído na definição predefinida, os utilizadores só precisam de executar o Application Verifier no seu código com as definições predefinidas para aproveitar as novas verificações.

Details

No mínimo, deve executar o Application Verifier com a opção Basics selecionada. Isto é necessário para o WinLogo e o WinQual. A definição Basics verifica o seguinte:

  • Detalhes de Paragem de Exceções - Garante que as aplicações não ocultam violações de acesso usando tratamento estruturado de exceções
  • Detalhes de Paragem de Handles - Testes para garantir que a aplicação não está a tentar usar handles inválidos
  • Detalhes do Heaps Stop - Verificações de corrupção de memória e problemas no heap
  • Detalhes de Paragem de Entrada/Saída - Monitoriza a execução de E/S assíncrona e realiza várias validações
  • Detalhes de Paragem de Fugas - Detete fugas ao rastrear os recursos gerados por uma DLL que não foram libertadas até à data em que a DLL foi descarregada
  • Detalhes da Paragem das Fechaduras - Verifica o uso correto para secções críticas
  • Memory Stop Details - Garante que as APIs para manipulações de espaço virtual são usadas corretamente (por exemplo, VirtualAlloc, MapViewOfFile)
  • Detalhes de Paragem TLS - Garante que as APIs de Armazenamento Local de Threads são usadas corretamente
  • Detalhes de Paragem do Threadpool - Assegura o uso correto das APIs do threadpool e impõe verificações de consistência nos estados do worker-thread após um callback

Se a sua aplicação estiver a migrar de uma aplicação "Pre-Vista", vai querer aproveitar o "LuaPriv" (também conhecido como verificações UAC). O Preditor de Privilégios de Conta de Utilizador Limitado (LuaPriv) tem dois objetivos principais:

  • Preditivo: Ao executar uma aplicação com privilégio administrativo, preveja se essa aplicação funcionaria tão bem se fosse executada com menos privilégios (geralmente, como utilizador normal). Por exemplo, se a aplicação escrever em ficheiros que só permitem o acesso aos Administradores, essa aplicação não poderá escrever no mesmo ficheiro se for executada como não-administradora.
  • Diagnóstico: Enquanto está a correr com privilégio não de administrador, identifique potenciais problemas que possam já existir na execução atual. Continuando o exemplo anterior, se a aplicação tentar escrever num ficheiro que conceda acesso apenas aos membros do grupo de Administradores, a aplicação receberá um erro de ACCESS_DENIED. Se a aplicação não funcionar corretamente, esta operação pode ser a culpada.

O LuaPriv identifica os seguintes tipos de problemas:

Problema Potencial Descrição
Espaços de Nomes Restritos Criar um objeto de sincronização nomeado (Event, Semáforo, Mutex, etc.) sem um namespace pode complicar a execução sem privilégios em alguns sistemas operativos porque o sistema operativo pode optar por colocar o objeto num namespace restrito. Criar tal objeto num espaço de nomes restrito (como o espaço de nomes Global) requer SeCreateGlobalPrivilege, que é concedido apenas a administradores.
O LuaPriv assinala ambos os problemas se os detetar.
Verificações Difíceis de Administrador Algumas aplicações interrogam o token de segurança do utilizador para descobrir quantos privilégios ele/ela possui. Nesses casos, a aplicação pode alterar o seu comportamento dependendo da quantidade de energia que considera que o utilizador tem.
O LuaPriv sinaliza chamadas API que devolvem esta informação.
Solicitar Privilégios Uma aplicação pode tentar ativar um privilégio relevante para a segurança (como SeTcbPrivilege ou SeSecurityPrivilege) antes de realizar uma operação que o requer.
Os flags LuaPriv tentam permitir privilégios relevantes para a segurança.
Privilégios em falta Se uma aplicação tentar ativar um privilégio que o utilizador não tem, provavelmente indica que a aplicação espera esse privilégio, o que pode causar diferenças de comportamento.
O LuaPriv assinala pedidos de privilégio falhados.
INI-File Operações Tentativas de escrita em ficheiros INI mapeados (WritePrivateProfileSection e APIs semelhantes) podem falhar para utilizadores não administradores.
O LuaPriv sinaliza tais operações.
Acesso Negado Se a aplicação tentar aceder a um objeto (ficheiro, chave de registo, etc.) mas a tentativa falhar devido a acesso insuficiente, então a aplicação provavelmente espera estar a correr com mais privilégios do que tem.
O LuaPriv sinaliza tentativas de abertura de objetos que falham com erros ACCESS_DENIED e semelhantes.
Negar ACEs Se um objeto tiver ACEs de Negação no seu DACL, então nega explicitamente o acesso a entidades específicas.
Isto é incomum e dificulta a previsão, por isso o LuaPriv sinaliza Negar ACEs quando os encontra.
Acesso Restrito Se uma aplicação tentar abrir um objeto para direitos que não são concedidos a utilizadores normais (por exemplo, tentar escrever num ficheiro que só pode ser escrito por administradores), então provavelmente a aplicação não funcionará da mesma forma quando executada como utilizador normal.
O LuaPriv sinaliza tais operações.
MAXIMUM_ALLOWED Se uma aplicação abrir um objeto durante MAXIMUM_ALLOWED, então a verificação de acesso real ao objeto ocorrerá noutro local. A maior parte do código que faz isto não funciona corretamente e quase certamente funcionará de forma diferente quando executado sem privilégio.
Assim, o LuaPriv sinaliza todos os incidentes de MAXIMUM_ALLOWED.

 

Questões frequentemente negligenciadas são captadas nos nebulosos Misc Checks:

  • APIs perigosas Detalhes de Paragem
  • Detalhes da Parada em Dirty Stacks
  • Rolamento Temporal

Adicionámos um novo Verificador de Impressão. Esta camada ajuda a identificar e resolver problemas que podem surgir quando uma aplicação chama o subsistema de impressão. O Verificador de Impressão tem como alvo as duas camadas do subsistema de impressão, a camada PrintAPI e a camada PrintDriver.

Camada API de Impressão

O Print Verifier testa a interface entre um programa e o Winspool.drv e prntvpt.dll e testa as interfaces dessas DLLs.

Camada do Driver de Impressão

O Print Verifier também testa a interface entre um driver de impressão central como UNIDRV.DLL, UNIDRUI.DLL, PSCRIPT5.DLL, PS5UI.DLL ou MXDWDRV.DLL, e os plug-ins do driver de impressão.

Note que algumas destas verificações são apenas para o Windows 7, e outras simplesmente terão melhor desempenho no Windows 7.

Normalmente, apenas as versões de depuração executam o Application Verifier, pelo que o desempenho geralmente não é um problema. Se surgirem problemas de desempenho devido ao uso deste, ou de qualquer outro verificador de aplicação, execute uma verificação de cada vez até ter realizado todas as verificações necessárias.

Quase 10% das falhas de aplicações nos sistemas Windows devem-se à corrupção do heap. Estes crashes são quase impossíveis de depurar depois. A melhor forma de evitar estes problemas é testar com as funcionalidades do Page Heap encontradas no Application Verifier. Existem dois tipos de Página de Páginas: "Cheio" e "Leve". Cheio é o padrão; Forçará a parada instantânea do depurador assim que detetar corrupção. Esta funcionalidade DEVE ser executada enquanto está sob o depurador. No entanto, é também a que mais consome recursos. Se um utilizador estiver a ter problemas de temporização e já tiver executado um cenário em "Full" Page Heap, definir para "Light" provavelmente resolverá esses problemas. Além disso, o Light Page Heap não crasha até o processo terminar. Fornece um rastreio de pilha para a alocação, mas pode demorar consideravelmente mais tempo a diagnosticar do que aproveitar o seu equivalente completo.

Monitorize o estado de fiabilidade das aplicações através do portal web Winqual. Este portal mostra os relatórios de erros recolhidos através do Windows Error Reporting, tornando fácil identificar as falhas mais frequentes. Saiba mais sobre isto em Windows Error Reporting: Como Começar. A Microsoft não cobra por este serviço.

Para tirar partido do WinQual, deve:

  1. Registe a tua empresa para o WinQual, que requer um ID VeriSign. Pode encontrar informações sobre o Windows 7 sobre o WinQual no portal de programadores, agrupado sob Windows Vista SP1 \ Windows Server 2008. Em breve terá uma localização no Windows 7.
  2. Mapeie as aplicações ISV para um nome de produto e para o nome ISV, que liga os relatórios de falhas à empresa. Outros ISVs não conseguem ver os seus relatórios de erro.
  3. Use o portal para identificar os principais problemas. Os ISVs também podem criar respostas que informam os clientes sobre quais os passos a tomar após uma falha. O sistema de resposta suporta mais de 10 línguas em todo o mundo.

Mais uma nota: o Application Verifier só é tão bom quanto os caminhos de código contra os quais o executas. O valor de combinar esta ferramenta com uma ferramenta de cobertura de código não pode ser subestimado.

Ferramentas de Depuração para Windows:

Verificador de Aplicação:

WinQual: