DevSecOps

29 nov, 2010

IntelliTrace: voltando no tempo com o Visual Studio 2010

Publicidade

Olá, pessoal, como estão?

Nesse artigo vamos falar um pouco sobre um novo recurso desenvolvido pela Microsoft para o Visual Studio 2010 chamado IntelliTrace, que está disponível apenas na versão Ultimate do programa.

O IntelliTrace é uma inovação da Microsoft e é muito interessante. Ela guarda o histórico de tudo que aconteceu no seu sistema, tornando possível recuperar valores, voltar a pontos específicos e muito mais. Seria como se pudéssemos “voltar no tempo” dentro da nossa aplicação; como diria um amigo, estamos “voltando para o futuro” dentro do Visual Studio.

Por exemplo, quando há um bug/defeito para ser resolvido, o desenvolvedor tem que inserir
no código fonte uma série de “break points”, reexecutar o código fonte anotando
valores de variáveis, criando um mapa sobre quais métodos chamam outros métodos,
parâmetros passados de um método para outro, enfim, tudo isso consome muito tempo, pois é preciso pesquisar as razões pelas quais um problema ocorreu. Com o
IntelliTrace, todo esse trabalho, que acaba consumindo mais tmepo que a correção propriamente dita, é deixado de lado,
pois todo o histórico de chamadas, variáveis etc. fica registrado.

Além disso tudo, a ferramenta é única: não existe (ao menos eu não conheço)
nenhuma ferramenta, gratuita ou paga em Java, que faça o que a gente faz
com o IntelliTrace.

Mas vamos à prática que a coisa fica melhor, não é mesmo?

Em primeiro lugar, é preciso ver se o IntelliTrace está habilitado. Você pode verificar isso indo no menu Tools-> Options

Teremos a seguinte tela:

Aqui temos duas opções para o uso de IntelliTrace. Na primeira opção, o recurso irá coletar informações sobre os eventos, e na segunda, além disso, coleta também chamadas realizadas pelo debug. A segunda opção pode afetar um pouco o desempenho da sua aplicação, como você pode ler na imagem. Eu sugiro que você marque a segunda a opção, mas, fica a seu critério.

Existem outras opções interessantes no menu IntelliTrace, como que tipo de eventos ele vai analisar, por exemplo.

Agora vamos à parte boa, os códigos!

Primeiro vamos criar nosso projeto. Vá até o menu Fie-> New-> Project-> Visual C#-> Windows-> Console Application:

Vamos chamar nossa aplicação de JogandoDados. A idéia é simples, dois jogadores lançam um dado cada um e o sistema verifica quem ganhou a disputa.

Depois de criado o projeto o nosso código deverá estar assim:

namespace JogandoDados
{
class Program
{
static void Main(string[] args)
{
var jogador1 = new Jogador();
var jogador2 = new Jogador();

jogador1.nome = "José";
jogador2.nome = "João";

jogador1.lancarDado();
jogador2.lancarDado();

Console.WriteLine(jogador1.nome + " obteve o número " + jogador1.getValorDado() + " ao lançar o dado.");
Console.WriteLine(jogador2.nome + " obteve o número " + jogador2.getValorDado() + " ao lançar o dado.");
Console.WriteLine("");
Console.WriteLine("*****************Resultado****************");
Console.WriteLine("");

if (jogador1.getValorDado() > jogador2.getValorDado())
{
System.Console.WriteLine(jogador1.nome + " venceu!");
}
else if (jogador1.getValorDado() < jogador2.getValorDado())
{
System.Console.WriteLine(jogador2.nome + " venceu!");
}
else
{
System.Console.WriteLine("Não houve vencedor, a partida terminou empatada!");
}

Console.Read();
}
}

class Jogador
{
public string nome { get; set; }
private int valorDado;

public int getValorDado()
{
return valorDado;
}

public void lancarDado()
{
valorDado = new Random().Next(1, 6);
}
}
}

Como vocês podem ver é um código simples, mas eu gostaria de ressaltar alguns detalhes:

  1. Notem que a variável nome tem as funções get e set definidas para ela, por isso o uso do “{ get; set; }”; acontece de forma diferente com o valor do dado lançado pelo jogador, que será atribuído a partir do método lancarDado, por isso não devemos deixar que o valor seja atribuído fora da classe.
  2. Para esse nosso exemplo, o uso do random vai ser de grande utilidade. Isto porque o random muda de valor sempre que passamos por ele e veremos que com o IntelliTrace poderemos recuperar qualquer valor lançado por ele de maneira simples. Sem o IntelliTrace, mesmo que voltemos a nossa linha de debug (“aquela linha amarela”) para onde está o random, o valor retornado por ele sempre seria diferente.

Agora, vamos ver o IntelliTrace em ação.

Primeiro setamos um breakpoint no nosso código:

Perceba que uma nova barra de botões é criada, que é a do IntelliTrace. Nela podemos avançar ou voltar os eventos e chamadas do registradas pelo IntelliTrace.

Veja também que uma nova janela aparecerá; ela contém informações sobre o IntelliTrace.

Bem, vamos debugar nosso código até conseguirmos lançar os dois dados. A janela no IntelliTrace ficará assim:

Aí estão todos passos que fizemos até agora. É o nosso histórico. Note que na parte superior tem a seguinte informação “Switch to Call View”; clicando lá, teremos a seguinte visão dessa mesma janela:

São nossos passos vistos de uma maneira mais detalhada. Clicando sobre cada “passo” o IntelliTrace põe o cursor na respectiva linha e com o valor atribuído no momento em que o evento foi executado.

Para dar um molho a mais no nosso exemplo, vamos voltar à linha do debug onde atribuímos o nome do jogador.

Fazendo um novo debug você verá que o IntelliTrace guardará as informações coletadas sem perder as informações obtidas no debug anterior, podemos ver isso na foto abaixo:

Com isso podemos “voltar no tempo” e obter os valores obtidos em qualquer tempo. Muito legal, não é?

Essa é uma maneira nova e eficiente de debugar nossas aplicações e, se usada com sabedoria, pode ajudar a aumentar a nossa produtividade e a qualidade nos nossos códigos.

Gostou do Intellitrace? Espero que, se você ainda não usava a ferramente, tenha se interessado e comece a fazer seus testes. Lembre-se que ela só está disponível na versão Ultimate do Visual Studio 2010.

Um abraço a todos e até o próximo artigo.