Anúncios

Captura de dumps de memória com o Debug Diag

Uma das ferramentas mais populares na coleta de dumps de memória é o Debug Diag (http://www.microsoft.com/en-us/download/details.aspx?id=42933). Atualmente na versão 2.1, este utilitário permite que a coleta de dumps seja feita em um formato mais completo, sem perda de informações relevantes.

Uma das principais vantagens do uso do Debug Diag é a coleta de dumps a partir de triggers.

Como apresentado na imagem abaixo, podemos notar que o Debug Diag nos fornece três regras básicas para a criação de triggers coletoras de dumps de memória.

clip_image001

Basicamente essas três regras funcionam da seguinte maneira:

– Crash (Código gerenciado): regra ativada quando um processo com código gerenciado lança uma exceção.

– Performance (Código gerenciado): regra ativada quando o consumo de recursos computacionais de um processo com código gerenciado atinge um limiar de performance configurado (seja esse recurso computacional memória, CPU ou até mesmo tempo de resposta de uma requisição HTTP).

– Native Memory and Handle Leak (Código não-gerenciado): como o nome já diz, essa regra será ativada quando um processo com código não-gerenciado consumir mais memória do que o esperado ou seu consumo de handles estiver acima de um limiar recomendado.

Neste post trataremos de dois cenários comuns: captura de dump de memória após o crash em aplicações web hosteadas no IIS (User Crash) e captura de dump de memória após lentidão na execução de uma requisição HTTP (Long HTTP Response Time).

Para a execução destes exemplos criei uma aplicação ASP.NET Web Forms e a publiquei no IIS, dentro de um website chamado ‘WebExceptionThrower’ com um application pool dedicado, também chamado de ‘WebExceptionThrower’.

Essa aplicação web consiste de uma única página com dois botões. Cada botão contém código para estimular os exemplos que queremos exercitar.

User Crash

Para o exemplo de captura de dump a partir de um User Crash, adicionei um código que forçasse o estouro de uma exceção. O quadro a seguir exemplifica o código utilizado.

protected void UserCrashButton_Click(object sender, EventArgs e) {

    int a = 0;
    int b = 10;

    double c = b / a;
}

A exceção gerada a partir deste erro é uma ‘System.DivideByZeroException’. O tipo da exceção lançada já nos diz muito, pois podemos filtrar pelo Debug Diag o tipo de erro que queremos analisar.

clip_image003

Voltando ao Debug Diag, devemos selecionar a primeira regra: Crash. Na próxima janela selecionamos a aplicação/processo que tem gerado a exceção. Neste exemplo, como temos uma aplicação hosteada no IIS, selecionaremos a opção ‘A specific IIS web application pool’.

clip_image005

Note que todos os application pools existentes no IIS serão listados. Selecione o application pool desejado. Neste exemplo selecionaremos o application pool ‘WebExceptionThrower’.

clip_image007

Na próxima janela iremos configurar a coleta dos dumps de memória. Siga as seguintes instruções para configurar o Debug Diag para coleta de dumps de exceções do tipo ‘System.DivideByZeroException’:

1 – No campo ‘Action type for unconfigured first chance exceptions’ selecione ‘Full user dump’

2 – No campo ‘Action limit for unconfigured first chance exceptions’ configure para ‘3’

3 – Clique em ‘Exceptions…’ e siga as seguintes configurações:

4 – Clique em ‘Add Exception…’

5 – Selecione ‘CLR (.NET) 4.x Exception’

5.1 – No campo ‘Exeption Type Equals’ informe ‘System.DivideByZeroException’

5.2 – No campo ‘Action Type’ selecione ‘Full Userdump’

5.3 – No campo ‘Action Limite’ configure para ‘3’

Clicando em ‘Ok’, sua janela deve se parecer com a imagem a seguir.

clip_image008

Clicando em ‘Save & Close’, sua janela deve se parecer com a imagem a seguir.

clip_image010

Cliquem em ‘Next’, atribua um nome para a regra criada e um diretório de destino para os dumps de memória. Após clicar em ‘Next’, marque a opção ‘Activate the rule now’ e clique em ‘Finish’.

Volte a aplicação e simule o erro. Você notará que o Debug Diag possui uma coluna chamada ‘Userdump Count’, essa coluna exibe quantos dumps de memória foram capturados durante a execução da regra.

clip_image012

Long HTTP Response Time

Para o exemplo de captura de dump após a execução de uma requisição HTTP longa, crie um código com um thread sleep de 30 segundos. Esse tempo de irá será utilizado para simular qualquer possível operação que onere o tempo de execução, como uma consulta no banco de dados, acesso a algum recurso distribuído na rede, escrita em disco ou um simples processamento complexo. O código é simples e é demonstrado a seguir.

protected void LongHttpResponseTimeButton_Click(object sender, EventArgs e) {

    System.Threading.Thread.Sleep(30000);
}

Antes de darmos início ao processo de configuração do Debug Diag, é preciso que a feature de ‘Tracing’ do IIS esteja instalada no servidor web.

clip_image014

Para coleta de dumps a partir de uma regra de performance, selecione o tipo de regra ‘Performance’ e clique em ‘Next’.

clip_image016

Selecione agora a opção ‘HTTP Response Times’, assim a regra irá basear-se no tempo de resposta das requisições HTTP.

clip_image018

Na tela de configuração a seguir, forneça a url relativa ou o nome da página que será analisada (essa funcionalidade também funciona para serviços WCF que utilizam o protocolo HTTP), além do tempo máximo para geração do dump de memória. No exemplo a seguir, configurei coletas na página ‘Default.aspx’ e tempo máximo de espera de 15 segundos. Clique em Ok.

clip_image020

A janela a seguir irá apresentar todas as urls monitoradas pela regra. Clique em ‘Next’.

clip_image022

Na próxima janela é preciso adicionar um ‘Dump Target’. Clique em ‘Add Dump Target’ e no campo ‘Target Type’ selecione ‘Web Application Pool’. Selecione o application pool de sua aplicação e clique em ‘Ok’.

clip_image024

Na próxima janela configure a regra para:

1 – Generate a UserDumo every 3 seconds

2 – Start the timer when writing the dump file completes

3 – Stop after generating 3 UserDumps

4 – Collect Full UserDumps

clip_image026

Cliquem em ‘Next’, atribua um nome para a regra criada e um diretório de destino para os dumps de memória. Após clicar em ‘Next’, marque a opção ‘Activate the rule now’ e clique em ‘Finish’.

Volte a aplicação e simule a lentidão para coleta dos user dumps.

FH

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: