Desafio da Semana #1

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