• Sign in
 

LATAM Team blog

Search Blogs
Tags
  • Cloud
  • Cluster
  • Crash
  • Desarrollo
  • Desenvolvimento
  • Directory Services
  • DST
  • Español
  • Exchange/Outlook
  • Hang
  • High Availability
  • IIS
  • Networking
  • Office
  • People
  • Performance
  • Português
  • PowerShell Scripts
  • Security
  • Setup
  • Sharepoint
  • SQL
  • Virtualization
  • Windbg Scripts
  • Windows
Blog - News

Where Are You Coming From Today?

Where are you now?

Follow us on:

Options
  • Blog Home
  • About
  • Share this
  • RSS for posts
  • Atom
  • RSS for comments
Archive
Archives
  • May 2013 (4)
  • April 2013 (5)
  • March 2013 (6)
  • February 2013 (3)
  • January 2013 (3)
  • December 2012 (2)
  • November 2012 (1)
  • October 2012 (4)
  • September 2012 (5)
  • August 2012 (2)
  • July 2012 (2)
  • June 2012 (3)
  • May 2012 (13)
  • April 2012 (6)
  • March 2012 (6)
  • February 2012 (4)
  • January 2012 (7)
  • December 2011 (11)
  • October 2011 (6)
  • September 2011 (1)
  • August 2011 (3)
  • July 2011 (7)
  • June 2011 (6)
  • May 2011 (5)
  • April 2011 (2)
  • March 2011 (13)
  • February 2011 (1)
  • January 2011 (5)
  • December 2010 (6)
  • November 2010 (1)
  • October 2010 (6)
  • September 2010 (2)
  • August 2010 (3)
  • July 2010 (3)
  • June 2010 (5)
  • May 2010 (1)
  • April 2010 (10)
  • March 2010 (21)
  • February 2010 (8)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (5)
  • October 2009 (6)
  • September 2009 (8)
  • August 2009 (9)
  • July 2009 (1)
  • June 2009 (3)
  • May 2009 (2)
  • April 2009 (7)
  • March 2009 (4)
  • February 2009 (7)
  • January 2009 (7)
  • December 2008 (8)
  • November 2008 (7)
  • October 2008 (22)
  • September 2008 (17)
  • August 2008 (13)
  • July 2008 (11)
  • June 2008 (7)
  • May 2008 (3)
  • April 2008 (2)
  • March 2008 (6)
  • January 2008 (4)
  • December 2007 (9)
  • November 2007 (4)
  • October 2007 (3)
  • September 2007 (8)
  • August 2007 (4)
  • July 2007 (2)
  • June 2007 (5)
  • May 2007 (7)
  • April 2007 (9)
  • March 2007 (7)
  • February 2007 (6)
  • January 2007 (4)
  • December 2006 (14)
  • November 2006 (10)
  • October 2006 (10)
  • September 2006 (11)
  • August 2006 (15)
  • July 2006 (7)
  • June 2006 (14)
  • May 2006 (22)
  • April 2006 (16)
  • March 2006 (20)
  • January 2006 (1)

Desafio da Semana #1

TechNet Blogs > LATAM Team blog > Desafio da Semana #1

Desafio da Semana #1

LatamBlog
7 Apr 2006 6:14 PM
  • Comments 5

DESAFIO DA SEMANA

 

Esses dias fiquei pensando sobre o que poderia colocar no blog, além de artigos técnicos, que pudesse ser interessante. Pensei em técnicas de depuração com WinDbg para código nativo ou gerenciado, mostrar uso de algumas ferramentas de troubleshooting, falar sobre incidentes interessantes que pegamos aqui nos times de escalações, etc... mas uma rápida pesquisa na internet me mostrou que existem blogs aos montes falando sobre esses assuntos. A grande maioria é em inglês, entretanto,  para os que não dominam o idioma, com conhecimento de inglês técnico apenas é possível se entender muitas coisas.

Pois bem, me ocorreu de disseminar conhecimento sobre a forma de desafios! Pesquisei sobre isso e não vi blogs que fizessem isso, portanto, creio ser uma forma interessante de se disseminar e compartilhar conhecimento.

A idéia é colocar uma situação fictícia de um cliente que pede seu auxílio. A situação é uma breve descrição dos sintomas apresentados por uma aplicação, o código fonte ou instruções sobre como reproduzir os sintomas e a descrição do seu objetivo.

Portanto como um fictício engenheiro de escalação, seu objetivo será de isolar o problema, propor a devida solução para corrigi-lo e explicar a estratégia utilizada para isolar o problema.

Após uma semana colocarei a resposta e comentarei os posts. As aplicações serão em C, C++, Visual Basic 6, Visual Basic .NET ou C#. O nível de dificuldade será justo pois o objetivo é que para que muitos consigam resolver os problemas. Na verdade, o interessante será observar a estratégia usada para se isolar o problema e a solução proposta, pois diferentes abordagens e soluções poderão ser aplicadas na maioria dos problemas!

 

Essa abordagem será um modo interessante de compartilharmos conhecimento pois acredito que muitos vão propor estratégias criativas para se isolar o problema ou soluções criativas para corrigi-lo!

 

Portanto, vamos ao primeiro da série!

 

 

DESAFIO DA SEMANA #1

 

Um cliente contactou você porque uma aplicação C aparenta estar consumindo memória sem nunca liberá-la. Seu objetivo é de certificar que o sintoma é esse mesmo, e, em seguida, identificar o problema causando esse sintoma, propor uma solução (solução prática que exija o mínimo de alterações na aplicação) e descrever as possíveis estratégias para se isolar esse problema.

 

Nota: Imagine que você tenha que descrever um modo de se identificar o problema de memória que seja válido para essa simples aplicação e para uma grande aplicação com milhares de linhas de código. Esse é o objetivo mais importante desse desafio.

 

INSTRUÇÕES

 

Crie uma aplicação console em Visual C++ com nome de MemoryLeak.exe e coloque o seguinte código:

 

 

#include "stdafx.h"

#include <windows.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

#include <conio.h>

#include <process.h>

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// SINTOMAS:  Vazamento de memoria. (memory leak)

//

// OBJETIVO: Isolar o problema causando o memory leak e corrigir a aplicacao.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int _tmain(int argc, _TCHAR* argv[])

{

    _tprintf(_T("Memory Leak Demo\n"));

 

            _tprintf(_T("Pressione alguma tecla para iniciar...\n\n"));

            _getch();

 

    for(int i = 0; i < 50; i++)

    {

                        BYTE* pbyAllocated = (BYTE*) malloc (sizeof(BYTE) * (10000 * i));

 

                        if(pbyAllocated)

                        {

                                    _tprintf(_T("Memoria alocada com sucesso!\n"));

                        }

                        else

                        {

                                    _tprintf(_T("Alocacao de memoria falhou...\n"));

                        }

 

                        // Libera memoria

                        pbyAllocated = NULL;

 

                        Sleep(1000);

    }

 

            _tprintf(_T("Pressione alguma tecla para finalizar...\n"));

            _getch();

            return 0;

}

 

 

Gere um executável versão Debug ou Release.

 

Coloque sua resposta aqui no blog no seguinte formato:

 

SINTOMA

 

(é um vazamento de memória ou de handle?)

 

PROBLEMA

 

(o que está ocasionando o leak?)

 

SOLUÇÃO

 

(qual a solução proposta para corrigir o problema?)

 

ESTRATÉGIA

 

(qual estratégia você usou para comprovar os sintomas e isolar o problema?)

 

 

Na semana que vem colocarei uma resposta para esse desafio, mas sempre que possível estarei lendo os comentários e respondendo eventuais dúvidas.

 

Até a próxima!

Roberto Farah

  • 5 Comments
Desenvolvimento
Comments
Comments
  • Danilo
    8 Apr 2006 4:25 PM
    SINTOMA

    vazamento de memória...

    PROBLEMA

    a ausência de código para liberar a memória alocada dinamicamente

    SOLUÇÃO

    Desalocar a memória corretamente utilizando-se a função Free, para isso deve-se substituir o trecho:

    pbyAllocated = NULL;

    Por:

    Free(pbyAllocated);

    ESTRATÉGIA

    Para comprovação dos sintomas fiz a execução do aplicativo e monitorei a memória alocada utilizando-se um aplicativo de monitoração de processos simples (Process Explorer da SysInternals), com isso foi possível verificar que a cada passagem do FOR a memória ela alocada e nunca liberada. Para isolar o problema procurei no código por alocações de memória, foi encontrado o trecho:

    BYTE* pbyAllocated = (BYTE*) malloc (sizeof(BYTE) * (10000 * i));

    Visto isso procurei pelo código que faria a desalocaçao de pbyAlocated, quando encontrei o trecho:

    // Libera memoria
    pbyAllocated = NULL;

    Visto que não há nenhum outro trecho no código que tenta realizar a desalocação de memória, conclui que o código inserido no programa para realizar essa ação fora inserido equivocadamente, pois apenas setar o ponteiro para NULL não proporcionará a desalocação da memória.
  • Marcelo CC Cortes
    11 Apr 2006 11:55 AM
    SINTOMA

    A memória utilizada pelo programa está sempre aumentando enquanto o programa está sendo executado e não há evidencias de que a memória está sendo liberada. Provável memory leak.

    PROBLEMA

    Em C a maior causa de memory leaks é memória sendo alocada com malloc e nunca sendo liberada com free.


    SOLUÇÃO / ESTRATÉGIA

    Existem várias soluções, desde procurar por todos os mallocs e free (o que pode ser impossivel em aplicações grandes), até usar ferramentas que ajudam na caça aos memory leaks.

    O que eu faria em qualquer situação (programando em C) seria criar  minhas próprias funções de alocação de desalocação de memória. Na função de alocação eu armazenaria em uma estrutura, informações sobre a memória que está sendo alocada como por exemplo:
    - Nome da variável
    - Arquivo
    - Linha
    - Posição da memória alocada (ÓBVIAMENTE)

    E armazenaria essas informações numa BSTree ou numa Linked list. (O código de busca não precisa ser muito eficiente porque só vai ser usado em modo debug para diagnosticar o problema).

    Na funções de desalocação de memória, usando como chave de busca a posição de memória alocada, basta remover o indice da lista (BSTtree ou Linked List).

    Caso necessário poderiamos tb criar um log num arquivo de todas as alocações e desalocações de memória.

    Após a criação dessas funções, basta criar MACROS para substituir malloc e free em todo o código para usar as funções e para ativar ou desativar o código de detecção de memory leaks.

    Antes do termino do programa, basta checar a lista de alocação de memória e todas os membros dessa lista são memória que deveriam ter sido desalocados e óbviamente não foram.
  • Marcondes
    11 Apr 2006 10:32 PM
    SINTOMA

    Ao rodar o executável é possível perceber que a medida em que o tempo de execução avança, o programa aumenta o consumo de memória de maneira exponencial. Indício de que há um vazamento de memória (memory leak), ocasionado provavelmente pela alocação de memória sem sua posterior desalocação.

    PROBLEMA

    O programa analisado foi escrito em C. Em C, a forma de alocação de memória disponível para o programador é a função malloc(). A função aloca uma região contígua de memória de tamanho determinado pelo parâmetro informado à função. A função retorna um ponteiro para o início da área alocada. A única forma dessa área de memória ser liberada seria através da finalização do processo raiz do executável, ou então explicitamente pelo programador, através da função free(), à qual se indica o ponteiro da área que se deseja liberar. No programa analisado, é possível observer um loop no qual a cada iteração, um nova área de memória é alocada através da função malloc. Porém, ao final da iteração, é possível observar que a memória alocada não é liberada, uma vez que o a forma de desalocação está incorreta (ponteiro = NULL), de forma que na próxima iteração, a variável utilizada para guardar o ponteiro da área alocada é reutilizada para uma nova alocação, fazendo com que a área anteriormente alocada não seja mais referenciada (raiz do memory leak).

    SOLUÇÃO

    A função "inversa" ao malloc é a função free, em C. Portanto, sem alterar a lógica do programador, é possível corrigir o problema através da substituição do comando pbyAllocated = NULL; por Free(pbyAllocated);

    ESTRATÉGIA

    Rodar o programa executável e monitorar o consumo de memória através do gerenciador de tarefas do windows e dos contadores de performance do windows. Observar a lógica de alocação e desalocação de memória do programa tentando mapear o comportamento esperado do consumo de memória. Se a análise da execução do programa diferir do esperado, há um possível problema de vazamento de memória a ser investigado, entrando mais a fundo no funcionamento do programa.


    MARCONDES

  • Biel Rezende
    13 Apr 2006 8:16 AM
    Ola Pessoal!

    Não sei se aqui seria o local apropriado para estar falando sobre isso, mas como se trata de um assunto referente ao blog estou colocando meu post aqui mesmo.
    Caso venha estar incomodando ou exista um local adequado para este post peço desculpas ao moderador.

    Gostaria apenas de parabenizar o(s) criador (es) deste blog, tanto pelo seu conteúdo de arquivos, tais como dicas, exemplos, discussões e tutoriais, mas também pela brilhante idéia de terem criado o "DESAFIO DA SEMANA", cujo objetivo do mesmo é lançar um desafio aos usuários do blog e que os mesmos possam trazer a solução fazendo com que passemos por situações as quais geralmente não estamos acostumados a passar e nem mesmo a utilizar certas soluções.

    Não desenvolvo em linguagem C, porém acompanho todos os dias o blog e leio todos os posts independente da linguagem mencionada.

    Terminando então gostaria de mais uma vez pedir desculpas se postei em local errado, mas não poderia deixar de dar minha opinião sobre esta brilhante idéia que os criadores tiveram.
    Parabéns a todos os envolvidos e espero que este blog persista para que possamos a cada dia aprender mais com vocês.


    Um grande abraço, Biel.
  • Roberto Farah
    13 Apr 2006 6:51 PM
    Oi pessoal!
    Amanha estarei publicando as respostas desse desafio, um novo desafio novo e um artigo sobre DebugDiag.
    Aproveito para fazer uns comentarios sobre os posts acima. :)
    Primeiro, parabens a todos que responderam! As respostas estao corretas!
    Apresentarei, no artigo de respostas, algumas respostas usando os mesmos conceitos.
    Danilo e Marcondes usaram uma abordagem reativa que possibilita checar se ha' um potencial memory leak, independente da linguagem de programacao usada, sem necessidade de acesso ao fonte! Usamos muito esse conceito em situacoes reais. Marcelo sugeriu uma abordagem proativa onde o vazamento de memoria seria mostrado pela propria aplicacao, incluindo o local ocasionando o leak! Muito bom! Uma aplicacao que tenha implementado esse conceito evitaria abordagens reativas, economizando tempo de troubleshooting, recursos, etc...
    Na pratica costumamos usar ambos os conceitos com aplicacoes que nao tenham mecanismos de prevencao de vazamento de memoria, ou quando suspeitamos que o mecanismo em si tem problemas :) -  Agimos reativamente para comprovar o sintoma e identificar a aplicacao responsavel, depois recomendamos acoes proativas para evitar a ocorrencia do sintoma novamente. Explicarei mais sobre isso no artigo de resposta.
    Biel, muito obrigado pelo post! Continuarei a postar desafios semanais! O proximo sera em VB 6, depois C#, talvez coloque de Assembly tambem.
    Lembrando que o que realmente conta no Desafio da Semana e' a abordagem para isolar determinado problema e a solucao proposta, uma vez que os problemas serao relativamente simples. Minhas respostas nao devem ser tomadas como unicas, na verdade, tanto os modos de se isolar o problema quando, em muitos casos, as solucoes propostas deveriam ser vistas em termos de vantagens e desvantagens, desde que corretas.
    Obrigado a todos por participar e fiquem a vontade para sugerir artigos/desafios!
    :)
    Roberto Farah
Page 1 of 1 (5 items)
  • © 2013 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy & Cookies
  • 5.6.426.415
  • TechNet
  • Products
  • IT Resources
  • Downloads
  • Training
  • Support
Products
  • Windows
  • Windows
    Server
  • System
    Center
  • Internet
    Explorer
 
  • Office
  • Office 365
  • Exchange
    Server
 
  • SQL Server
  • SharePoint
    Products
  • Lync
  • See all products »
Resources
  • Evaluation Center
  • Learning Resources
  • Microsoft IT Camps
  • Microsoft Technical Communities
  • Microsoft Virtual Academy
  • Script Center
  • Server and Tools Blogs
  • Solution Accelerators
  • TechNet Blogs
 
  • TechNet Flash Newsletter
  • TechNet Gallery
  • TechNet Library
  • TechNet Magazine
  • TechNet Subscriptions
  • TechNet Video
  • TechNet Wiki
  • Windows Sysinternals
  • Virtual Labs
Solutions
  • Networking
  • Cloud and Datacenter
  • Security
  • Virtualization
Updates
  • Service Packs
  • Security Bulletins
  • Microsoft Update
Trials
  • Windows Server 2012
  • System Center 2012 SP1
  • Microsoft SQL Server 2012 SP1
  • Windows 8 Enterprise
  • See all trials »
Related Sites
  • Microsoft Download Center
  • TechNet Evaluation Center
  • Drivers
  • Compatability & Converters
  • Windows Sysinternals
  • TechNet Gallery
Training
  • Training Catalog
  • Class Locator
  • Microsoft Virtual Academy
  • Free Windows Server 2012 courses
  • Free Windows 8 courses
  • SQL Server training
  • e-Learning overview
Certifications
  • Certification overview
  • MCSA: Windows 8
  • Windows Server Certification (MCSE)
  • Private Cloud Certification (MCSE)
  • SQL Server Certification (MCSE)
Other resources
  • TechNet Events
  • Second shot for certification
  • Born To Learn blog
  • IT Camps
Support by product
  • Exchange Server
  • Forefront Server
  • Forefront Edge Security
  • Forefront Server Security
  • Internet Explorer
  • Office
  • SharePoint
 
  • SQL Server
  • System Center
  • Windows Server
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
Other support links
  • Microsoft Premier Online
  • Microsoft Fix It Center
  • TechNet Forums
  • MSDN Forums
  • Security Bulletins & Advisories
  • International support solutions
  • Log a support ticket
  • Look up event IDs and error codes
Not an IT pro?
  • Microsoft Customer Support
  • Microsoft Community Forums