Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Breakpoints: com depurar suas aplicações - Revista easy .Net Magazine 19
O artigo mostra as principais ferramentas disponibilizadas pelo Visual Studio para o programador realizar a depuração do seu código com o objetivo de encontrar e corrigir erros que possam ter aparecido em sua aplicação. Um exemplo é quando desej
Você não gostou da qualidade deste conteúdo?
(opcional) Você gostaria de comentar o que não lhe agradou?
[Artigo disponível no Leitor Digital DevMedia. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Easy .net magazine 19
Desenvolver um bom software sem realizar sua devida depuração é algo
praticamente impossível, considerando a realidade dos projetos de software que
existem hoje em dia. Sempre haverá algum ponto do código que irá estar sujeito
a algum tipo de falha, seja nos momentos em que novos requisitos forem
incluídos, novas plataformas forem suportadas ou mesmo ao interagir com outras
partes de software.
Os bons projetos precisam reduzir o índice de bugs para o menor
número possível, mas, precisam também facilitar a localização e solução destes
quando surgirem. Estas são desde as mais básicas, como a interrupção do código
para inspeção dos objetos na memória – o que é feito pelo já conhecido breakpoint,
até preparar o código das classes para que apresentem informações que ajudem o
programador a identificar o que está “acontecendo” com o seu código em um
determinado ponto da execução.
É fato que quanto maior e mais complexo o projeto, mais difícil
será fazer a depuração, entretanto, com as técnicas apresentadas aqui, até
mesmo projetos imensos podem ser depurados e ter seus problemas resolvidos.
Resolvendo problemas
na aplicação
Tudo se inicia dentro da IDE do Visual Studio ao se executar o
código do projeto que é o objeto de depuração.
Neste artigo vamos considerar apenas a depuração de códigos
baseados em aplicações que tenham alguma interface com o usuário, como
aplicativos Windows Forms, WPF, ASP.NET etc. Os tópicos apresentados aqui são
mais indicados para estes tipos de projetos, mas, também é possível realizar a
depuração em outros, como Webservices e serviços do Windows, para serem
depurados quando o código está disponível ou até mesmo, fazer a depuração de
processos remotamente localizados.
Para iniciar a depuração é preciso que o código esteja sendo executado - aqui cabe uma observação importante para os programadores iniciantes: uma class library precisa estar anexada com um projeto executável que seja uma UI (interface com o usuário) para poder ser depurado. Se você tentar depurar um projeto deste tipo no Visual Studio, vai receber uma mensagem de que não é possível executar diretamente um projeto deste tipo.
Os primeiros passos para entender como funciona a depuração é conhecer as duas modalidades para compilação e execução de um projeto, que são Debug e Release. Projetos no modo Debug incluem informações que facilitam a localização no código, como a call stack – que é a hierarquia de chamadas dos métodos e classes – contendo o número da linha da chamada no código e outros dados importantes para depuração, estes, que serão mostrados nos próximos tópicos.
Normalmente, a opção escolhida para a compilação do projeto é o
modo Debug (este é utilizado durante o desenvolvimento/testes da aplicação) e
após, é alterado para o modo Release para ser enviado ao usuário final.
A maneira mais simples de alterar o modo de compilação do
projeto é através da barra de ferramentas, como ilustrado na Figura 1. Este modo é selecionado como
padrão ao criar um novo projeto.
Existem algumas formas de iniciar a depuração de seu aplicativo: clicando no botão executar (ao lado do seletor de modo, na barra de ferramentas), pressionando F5, utilizando o meu Debug > Start Debugging ou na janela Solution Explorer, com o botão direito sobre o ícone do projeto, escolhendo Debug > Start Debugging (Figura 2).
Com este processo, eventuais breakpoints informados no projeto serão executados, mas, é importante entender primeiramente algumas características dos breakpoints.
Breakpoint
Estes são pontos de parada na execução do código para que seja
possível inspecionar principalmente a memória e visualizar os objetos que estão
carregados.
Para estabelecer um breakpoint basta ir ao ponto do código que
se deseja inspecionar pressionar F9 ou ainda, realizar um click (criando um círculo
vermelho) na faixa do lado esquerdo da linha que deseja parar. A Figura 3 mostra um breakpoint definido.
Quando um breakpoint é atingido, várias ações podem ser tomadas pelo programador. Primeiramente, se pararmos com o ponteiro do mouse sobre os objetos que fazem parte do contexto da execução, o IntelliSense do Visual Studio mostra parte do conteúdo destes, conforme pode ser conferido na Figura 5.
Esta janela é recursiva e permite expandir os objetos que estão
dentro do objeto inicial em cascata.
Também é possível inspecionar os objetos através da janela
Locals, que fica na região inferior da janela do Visual Studio. A Figura 6 mostra o objeto sendo
inspecionado por esta janela.
Além da variável objeto do contexto onde o breakpoint foi colocado, também as demais que fazem parte do contexto do método são exibidas, como this – que referencia a classe do método em questão, os objetos sender e “e” que são os argumentos passados para o método.
Outra janela útil no processo de depuração é a Immediate Window
(Figura 7). Nela é possível
interagir com os objetos acessando suas propriedades e fazendo chamada a
métodos da classe e códigos do C#.
Além de prosseguir ou interromper definitivamente a execução do
programa, é possível ir executando passo a passo o código com Step Over e Step
Into.
O Step Over faz com que o código passe para a próxima instrução
dentro do método atual, executando o programa linha a linha dentro deste. Para
fazer isto, você pode utilizar a tecla F10 do teclado ou ainda o menu Debug
> Step Over.
Já com Step Into, o código navega para dentro dos códigos dos
métodos chamados, o que é útil quando se deseja inspecionar um programa, mais
precisamente, quando há dúvidas sobre em qual método o problema pode ser
encontrado.
A Figura 8 mostra um
Step Into sendo executado no breakpoint que foi definido anteriormente.
A tecla de atalho para Step Into é F11 ou menu Debug > Step
Into.
Novamente, estão disponíveis nas janelas Immediate Window,
Locals e o InteliSense para inspecionar o conteúdo dos objetos.
Condições para
breakpoint
Um recurso interessante do breakpoint é aquele que permite
estabelecer uma condição lógica para que haja uma parada no código.
Considere, por exemplo, uma coleção extensa de dados. Durante os
testes, observou-se que somente há problema no código quando atinge um item em
especial nesta lista.
Com o breakpoint condicional, você pode fazer com que o programa
só seja suspenso quando uma determinada condição – que pode ser expressa utilizados
códigos C# que você está acostumado – for verdadeira. Para isso, deve clicar
com o botão direito do mouse sobre o breakpoint (em tempo de execução ou de
projeto) e acessar o menu Conditions, que faz com que a janela da Figura 9 seja exibida para escrever a
condição desejada.
Como é possível perceber, o InteliSense está disponível também nesta janela, o que facilita a construção de expressões para o breakpoint.
Quando o código for executado, somente será feita a parada ao
atingir a expressão que está definida. Mas, nem só de breakpoint é feita a depuração
no Visual Studio.
Escrevendo na janela
Output
A IDE do Visual Studio possui uma janela chamada Output que
normalmente mostra informações geradas durante a compilação do projeto.
Entretanto, esta também pode ser utilizada para auxiliar a depuração do código da aplicação. Para fazer isto, basta incluir em seu código – tanto faz se numa classe de uma class library ou interface de usuário, a instrução “Console.Writeline”. Observe a "
Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Vladimir Rech
Formado em Tecnologia em desenvolvimento de software pela UTF/PR. Desenvolvedor de software. Palestrante.



