Windows 8

Introdução à depuração de aplicativos da Windows Store

Bruno Terkaly
Robert Evans

Na década de 40, quando um dos programas da Almirante Grace Hopper não funcionou corretamente, ela descobriu uma traça presa entre os relés do Mark II da Harvard, e foi assim que o termo “bug” nasceu. É claro que, atualmente, debugging (depuração) não tem nada a ver com insetos. Tudo está relacionado ao processo de localizar e remover defeitos em softwares.

Apesar do fato de que as linguagens e as ferramentas de programação atuais ajudam muito os desenvolvedores a escrever código robusto, não há nenhuma proteção contra erros de lógica. Os compiladores modernos podem executar apenas verificações rudimentares em relação à sintaxe das linguagens de programação e ao uso adequado do sistema de tipos. O compilador faz muito pouco para ajudar você a determinar o comportamento real do tempo de execução de seu aplicativo. É aí que as habilidades de depuração são essenciais. Este artigo se concentrará na depuração de aplicativos da Windows Store e explorará algumas das técnicas usadas no campo.

Estaremos usando o Visual Studio 2013 Preview, embora essas técnicas irão funcionar normalmente com versões anteriores do produto. Antes de começar, no entanto, você precisará preparar seu ambiente para depuração mais avançada, além da fornecida pelo Visual Studio. Recomendamos baixar e instalar os seguintes recursos:

Gerenciamento do Tempo de Vida do Processo

Com aplicativos típicos de área de trabalho, o usuário inicia um aplicativo e ele é executado até que o usuário o termine. O aplicativo continua em execução mesmo quando não está em primeiro plano. Os aplicativos da Windows Store são um pouco diferentes. Quando um aplicativo não está no primeiro plano, um Serviço Windows, o agente do tempo de execução, suspende todos os threads do aplicativo e os ativa novamente apenas quando o aplicativo está em primeiro plano. Esse novo recurso ajuda a preservar o desempenho geral do sistema e a vida útil da bateria. No Windows 8.1, mesmo quando um aplicativo é fechado pelo usuário, a ação padrão é colocar o aplicativo em estado de suspenso e não terminá-lo. Se preferir a funcionalidade mais antiga do Windows 8, você poderá definir Windows.ApplicationModel.ClosePolicy.TerminateOnClose como true.

Os eventos Suspender e Continuar são enviados ao aplicativo, dando a oportunidade de você armazenar e recuperar o estado ou tomar outras ações conforme necessário. Além disso, se um aplicativo aplicar muita pressão na memória ou levar muito tempo para iniciar, o agente do tempo de execução terminará o aplicativo, desativando todos os threads. O Visual Studio desabilita automaticamente o PLM (Gerenciamento do Tempo de Vida do Processo) para aplicativos que estão sendo depurados, quer você esteja depurando seu próprio aplicativo ou conectando-se a um aplicativo instalado (usando Depurar | Depurar Pacote do Aplicativo Instalado). É importante que o PLM seja desabilitado porque ele impediria você de depurar corretamente um aplicativo. O motivo é simples, o agente do tempo de execução pode entrar e terminar seu aplicativo antes que ele possa ser depurado corretamente.

No entanto, alguns dos depuradores fora do Visual Studio, como o WinDbg (Depurador do Windows) e o Microsoft Console Debugger (CDB), exige que você desabilite os recursos do PLM. Para desabilitar o PLM manualmente, você pode usar a ferramenta PLMDebug disponível no SDK do Windows 8.1. O PLMDebug é uma ferramenta de linha de comando que permite desabilitar o PLM para um pacote .appx específico usando a opção /enableDebug. É possível exibir todos os pacotes de aplicativos instalados por meio do comando Get-AppxPackage do Windows PowerShell ou do Process Explorer (conforme descrito posteriormente neste artigo) para identificar a ID do pacote .appx específico. 

O PLMDebug possui vários recursos úteis. Por exemplo, permite que você envie explicitamente vários eventos a seu aplicativo, incluindo Suspend, Resume, Terminate, Force-terminate e Clean-terminate. Também permite que você conecte um depurador ativo (que não abordaremos neste artigo).

O Visual Studio também permite disparar os eventos Suspender e Continuar usando a barra de ferramentas de Depurar Local que, por padrão, não é visível. Você pode adicioná-la selecionando Exibir | Barras de ferramentas | Depurar local. As opções de depuração serão habilitadas quando você estiver depurando ativamente seu aplicativo. A Figura 1 mostra a barra de ferramentas de Depurar Local no Visual Studio 2013 Preview.

The Debug Location Toolbar
Figura 1 A barra de ferramentas de Depurar Local

Tarefas em segundo plano

Muitos cenários, como a atualização de um bloco dinâmico, podem ser realizados sem usar uma tarefa em segundo plano, mas algumas vezes as tarefas em segundo plano são necessárias e representam outra maneira na qual o código de seu aplicativo da Windows Store pode ser iniciado implicitamente devido a condições específicas do sistema que você define. Por exemplo, você pode desejar adicionar ou criar miniaturas no segundo plano para um de seus aplicativos, mas deseja fazer isso apenas quando o dispositivo estiver usando energia CA. O Gatilho de Manutenção permite iniciar algumas tarefas com base em intervalos de tempo e condições do sistema e executar tarefas repetidamente. Embora o código de tarefas em segundo plano esteja definido em seu aplicativo, na maioria dos casos ele é executado por um processo separado denominado BackgroundTaskHost.

Um aplicativo da Windows Store registra suas tarefas em segundo plano com a infraestrutura da tarefa em segundo plano em nível de sistema operacional usando a classe BackgroundTaskBuilder. A tarefa em segundo plano é criada como uma classe que implementa a interface IBackgroundTask, e você simplesmente precisa implementar o método Run. Uma tarefa em segundo plano deve ter exatamente um gatilho e uma ou mais condições definidas que descrevam as circunstâncias exatas nas quais iniciar a tarefa em segundo plano. O gatilho é especificado com o método SetTrigger da classe BackgroundTaskBuilder.

O Visual Studio facilita a localização e a depuração de tarefas em segundo plano porque a barra de ferramentas Depurar Local mostrará as tarefas em segundo plano declaradas de seu aplicativo e permitirá que você as inicie por meio da interface visual do Visual Studio. Essa técnica funciona para iniciar todas as tarefas em segundo plano, com exceção das que usam ControlChannelTrigger, PushNotificationTrigger ou um SystemTrigger com o tipo de gatilho SmsReceived. Para obter mais informações, consulte o white paper "Introdução a tarefas em segundo plano” em aka.ms/O35jqc. E você encontrará um código de exemplo em bit.ly/IZpfqN.

Ativações

Há muitas maneiras de iniciar seu aplicativo, dependendo do que você implementou, como File, Protocol, PrintTaskSettings ou ShareTarget. Por exemplo, o tipo de ativação ShareTarget deve estar ativo quando um usuário compartilha algo de outro aplicativo com seu aplicativo.

Houve algumas alterações no Windows 8.1 com relação a ativações. A ativação Search, por exemplo, foi preterida, mas há algum suporte para compatibilidade com versões anteriores Também existe uma nova abordagem inovadora para iniciar outros aplicativos que compartilham a tela com seu aplicativo. Isso significa que você pode compartilhar a tela com um navegador enquanto seu aplicativo ainda estiver ativo. Você encontrará mais informações sobre essa funcionalidade em bit.ly/11ckVS3.

Para depurar seu aplicativo em qualquer um desses tipos de ativação, o primeiro passo é ir para as propriedades Start Actions do projeto de seu aplicativo. Comece clicando com o botão direito do mouse no ContosoCookbook no Gerenciador de Soluções do Visual Studio e escolhendo Propriedades. Selecione a caixa de seleção "Não iniciar, mas sim depurar meu código quando iniciar", conforme mostrado na Figura 2. Com essa configuração, você poderá depurar seu aplicativo e colocar pontos de interrupção em seu manipulador OnLaunched que será disparado quando ativado por qualquer um dos outros tipo de ativação. Essa configuração informa ao aplicativo para se preparar para a depuração, mas para não iniciar realmente quando você iniciar uma sessão do depurador. O aplicativo simplesmente esperará.

Setting Debugger Properties
Figura 2 Configurando as propriedades do depurador

Explorando um aplicativo em execução

O Process Explorer fornece alguns recursos úteis para quando você desejar dar uma olhada nas operações internas de um aplicativo em execução. Para ver esses recursos, exploraremos um pouco do código em um aplicativo chamado Kids Car Colors, que você pode baixar em bit.ly/YnmAxT. Vá para a tela inicial e inicie o aplicativo Kids Car Colors e, em seguida, inicie o Process Explorer (supondo-se que você o tenha configurado anteriormente).

Se você expandir o svchost.exe, verá o agente de tempo de execução e quaisquer aplicativos da Windows Store em execução, conforme mostrado na Figura 3. Clicando com o botão direito do mouse em KidsCarColors.exe, você poderá exibir as propriedades, como a instalação da pasta raiz.

Process Explorer from SysInternals
Figura 3 Process Explorer em SysInternals

A janela Propriedades de um aplicativo no Process Explorer fornece muitas informações. Por exemplo, como mostra a Figura 4, a guia Imagem permite que você exiba o local de um determinado aplicativo instalado. Os aplicativos internos e os aplicativos baixados da Windows Store sempre são instalados na pasta [Pasta Raiz]\Arquivos de Programas\Windows Apps.

Properties of the Kids Car Colors App
Figura 4 Propriedades do aplicativo Kids Car Colors

Você também considerará a guia .NET Performance útil. Ela fornece informações básicas do contador de desempenho, incluindo informações como tamanho da pilha, o número de Gen 0 Collections e a porcentagem de tempo gasto em GC (coleta de lixo). A verificação desses contadores de desempenho permite que você avalie a efetividade da GC, que é o mecanismo que libera memória quando objetos não são mais referenciados. Pode ser necessário modificar o código de um aplicativo para liberar memória mais agressivamente quando ela não é necessária. Você pode obter mais informações sobre os contadores de desempenho do .NET em msdn.microsoft.com/library/w8f5kw2e.

Pode ser necessário alterar a propriedade e as permissões da pasta C:\Arquivos de Programas\Windows Apps para que você possa exibir os aplicativos dentro dela.

Dentro da pasta C:\Arquivos de Programas\Windows Apps, existem pastas paralelas para cada um dos aplicativos instalados. Cada uma dessas pastas de aplicativos tem uma grande quantidade de informações, conforme descrito na próxima seção.

Explorando o código

Conforme mencionado, você pode ir para o diretório de instalação de aplicativos individuais e localizar uma grande quantidade de informações sobre o aplicativo, como todos os arquivos MP3 (se houver), as imagens, os arquivos XAML e outros recursos. No entanto, você não poderá examinar os arquivos XAML de aplicativos do Windows 8.1, porque eles foram compilados em um binário. Mas há várias ferramentas que permitem descompilar os executáveis de aplicativos da Windows Store escritos em C# e em Visual Basic .NET.

Vamos descompilar o KidsCarColors.exe usando a ferramenta JustDecompile da Telerik. A descompilação é o processo de utilizar o binário de um aplicativo e gerar código-fonte legível. Para fazer isso, basta navegar para a pasta de instalação do aplicativo conforme explicado anteriormente, clicar com o botão direito do mouse em KidsCarColors.exe e escolher Abrir com o JustDecompile. Conforme mostrado na Figura 5, você agora pode ver os detalhes de baixo nível do código revelados pelo descompilador. Observe que o modelo de dados dentro do aplicativo é fácil de decifrar e de procurar. O JustDecompile facilita a recuperação de código-fonte perdido ou o exame de assemblies para descobrir a causa raiz de um bug externo. Isso significa que você pode exibir o código-fonte de praticamente qualquer aplicativo da Windows Store instalado.

Decompiling KidsCarColors.exe
Figura 5 Descompilação de KidsCarColors.exe

É impressionante a quantidade de informações que é disponibilizada por essa ferramenta. A criação de Kids Car Colors exigiu algum esforço para fazer com que o áudio funcionasse bem quando uma criança clicasse na cor do carro. Mas todo esse código está exposto. Se você navegar para o objeto ItemDetailPage no explorador de projetos do JustDecompile, você poderá descobrir exatamente como os arquivos de som são reproduzidos: recuperando o MP3 do armazenamento local, criando uma instância de vários MediaElements, registrando eventos de retorno de chamada de mídia, chamando SetSource e assim por diante. Está tudo lá, exposto para o mundo, para quem quiser replicar essa abordagem.

O JustDecompile fornece alguns botões em sua barra de ferramentas, incluindo o botão Assembly List, que permite explorar as referências definidas pelo aplicativo. Basta saber quais referências foram definidas por um aplicativo da Windows Store para você perceber qual funcionalidade é usada pelo aplicativo. Por exemplo, você pode ver que Kids Car Colors utiliza o SDK do Advertising. Isso faz sentido, porque o aplicativo realmente mostra anúncios. Teoricamente, no entanto, você pode definir uma referência a um assembly que nunca usa. Imagine que removemos o anúncio do aplicativo, mas esquecemos de remover a referência ao assembly do SDK do Advertising. O JustDecompile permite que você veja exatamente qual versão está à solta em execução e qual é a aparência do código e das referências.

O JustDecompile também inclui um recurso chamado Find Usages, que permite replicar o comando Localizar todas as referências do Visual Studio. Você pode simplesmente usar Ctrl+clique em qualquer Namespace, Tipo ou Membro de seu código descompilado para obter uma lista de todas as referências de código correspondentes. Isso pode ser uma enorme ajuda para aprender como um aplicativo funciona, sem ter nenhum código-fonte.

Conclusão

Para maximizar sua eficiência como um desenvolvedor de aplicativos da Windows Store, você precisa ter um bom entendimento de como depurar aplicativos. Este artigo fornece uma visão geral breve de algumas ferramentas e técnicas que podem ser usadas para localizar e corrigir problemas em seu código. Além disso, algumas das técnicas podem ajudar você a aprender como funcionam outros aplicativos da Windows Store, mesmo que você não tenha o código-fonte.

Bruno Terkaly é desenvolvedor e divulgador da Microsoft. Seu profundo conhecimento é fruto de anos de experiência no campo, escrevendo código para uma grande quantidade de plataformas, linguagens, estruturas, SDKs, bibliotecas e APIs. Ele passa seu tempo escrevendo código, escrevendo blogs e fazendo apresentações ao vivo sobre como criar aplicativos baseados na nuvem, especificamente usando a plataforma Windows Azure. Você pode ler seu blog em blogs.msdn.com/b/brunoterkaly.

Robert Evans é engenheiro-chefe de campo e líder técnico do Windows 8: Laboratórios de aplicativos da Windows Store. Ele é Microsoft Certified Professional Developer e instrutor mestre de treinamento de desenvolvimento em Windows 8. Ele se apresentou na TechReady, GeekReady e The Tablet Show e organizou o laboratório de hardware do Windows 8 na conferência Microsoft Build, além de vários eventos Hackathon do Windows 8. Antes de se tornar um engenheiro-chefe de campo, Evans passou 12 anos como engenheiro de desenvolvimento de software na Microsoft trabalhando em vários produtos, como Xbox Live, MSN, Mobile Engineering e na TI da Microsoft. Você pode ler o blog Premier Field Engineering com o qual ele contribui, em aka.ms/Utg864.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Christophe Nasarre-Soulier (Microsoft)
Christophe Nasarre trabalha em uma equipe de suporte ao desenvolvimento na Microsoft. Trabalha desde 1996 como editor técnico de vários livros e escreveu vários artigos para a MSDN Magazine.