Press "Enter" to skip to content

Post-mortem debugging – Dumps de memória

Hora de continuar a série sobre post-mortem debugging. Hoje vou falar sobre dumps de memória e as melhores formas para cria-los.

Se você está chegando agora: confira o primeiro post da série.

Fazendo uma revisão rápida, post-mortem debugging é a técnica onde depuramos a aplicação depois que ela deu problema. O artefato que usamos para a depuração é exatamente um dump de memória daquela aplicação.

Vamos ver uma definição do que é um dump de memória:

A dump file is a snapshot of an app at the point in time the dump is taken. It shows what process was executing and what modules were loaded. If the dump was saved with heap information, the dump file contains a snapshot of what was in the app’s memory at that point in time.

Muito bem, se um dump contém informações sobre a aplicação é de extrema importância que ele seja criado no momento correto. Como assim no momento correto, Márcio? Imagina que sua aplicação apresente um DivisionByZeroException. Se você criar um dump no exato momento que a exceção ocorrer, com certeza o arquivo terá informações da exceção, a stack da CLR, o que tinha em memória naquele momento.

Lembre-se que se sua aplicação não fechar, ou seja, apresentou a exceção e o usuário continuou utilizando, a stack daquela thread já vai mudar, o garbage collector em breve vai limpar sua exceção da memória e aí quando você criar o dump pode não encontrar mais informações sobre a causa da DivisionByZeroException.

Então vai a primeira dica/regra para identificar problemas analisando dumps: Crie os arquivos de dump no momento em que o problema ocorre 😉.

Agora que vimos a importância de criar os dumps no momento correto, como fazemos isso? Afinal, o problema ocorre em produção. Não vamos ficar olhando para o computador esperando o problema acontecer, certo?

Gosto de mostrar 2 métodos básicos para a criação dos dumps.

Método 01: Gerenciador de tarefas

Lembra que comentei sobre a importância do momento exato na criação do dump? Pois é, na prática, às vezes, não é possível. O problema ocorre, seu cliente liga e você não vai ter tempo para instalar/usar as ferramentas que vou mostrar abaixo.

Neste cenário utilize o gerenciador de tarefas do Windows. Com o botão direito do mouse em um processo é só clicar no item de menu “Criar arquivo de despejo”.

Método 02: Utilizando o ProcDump

Esse é o melhor :D.

O ProcDump é um utilitário de linha de comando para criação de dumps. Com ele eu consigo configurar gatilhos para a criação do dump. Vou falar novamente porque é importante. Criar o dump no momento certo é essencial, logo, criar gatilhos salva o dia :). Outra coisa simples mas importante, é que ele não exige instalação. Sim! Alguns clientes não autorizam ou não gostam que você fique instalando softwares nos servidores deles :).

Vamos ver alguns exemplos do que podemos fazer com o ProcDump.


Você vai encontrar outros exemplos de utilização no site oficial.

Utilizando o ProcDump você consegue configurar algum gatilho, deixar seu cliente utilizando a aplicação, e quando o problema ocorrer novamente você vai ter certeza que um dump será criado. E não importa o tipo do problema, se é um alto consumo de CPU, memória ou até mesmo uma exceção.

Vale deixar registrado aqui também o DebugDiag. Ele também permite criar gatilhos, e é uma ferramenta visual. Mas exige instalação então costumo não utilizar. Mas também é uma ótima ferramenta, vale conhecer.

Por hoje é isso, agora que sabemos o que é e como criar os arquivos de dump no próximo post vamos conhecer o WinDBG.

Abraços.

  • Leandro Laia

    Legal cara. Dicas valiosas. 🙂

  • Zoio Silva

    Por vontade do destino, eu nunca passei por uma situação assim pessoalmente. Mas eu ando com uma galera aí que já. Nunca mais vou esquecer disto. Valeu!

  • João Gabriel Vilela

    Muito legal o post. Bom saber que existem ferramentas como estas.