Como rastrear / corrigir um problema relacionado à memória em um código C / C ++ grande em sistemas * nix

9

Qual estratégia você usa ao rastrear um problema relacionado à memória? Quais ferramentas você usa (código aberto e proprietário) para identificar vazamentos de memória, corrupção de memória, etc.? Como você rastrearia vazamentos de memória se apenas o gdb / dbx estivesse disponível em um sistema?

Para mim, consertar vazamentos de memória apenas com um depurador é muito difícil.

    
por Hemant 11.08.2010 / 05:07

5 respostas

12

Se você puder alterar o código-fonte, Dmalloc é ótimo; ele listará quais ponteiros foram unfreed e (para código construído com símbolos de depuração) exatamente em qual linha eles foram alocados.

Se você não pode, Valgrind é praticamente o padrão para esse tipo de coisa. Eu geralmente acho Valgrind um pouco mais difícil de usar, mas tem muito mais recursos e não envolve adicionar chamadas dmalloc em seu código

    
por 11.08.2010 / 05:26
7

Valgrind é incrivelmente útil.

    
por 11.08.2010 / 05:08
2

Massif (de valgrind) é uma das melhores maneiras de encontrar vazamentos de memória. Repita seu código suspeito (ou execute seu programa por tempo suficiente) e despeje o resultado com ms_print. Normalmente, a pilha de chamadas fornece informações suficientes para corrigi-lo.

Com o GDB, você pode tentar se conectar a um programa em execução e chamar funções como malloc_stats()

Se o seu programa estiver escrito em um idioma diferente, pode ser mais complicado. Recentemente, alguns GDBs ganharam scripts, e pessoas começaram projetos interessantes como o gdb-heap , que pode analisar a memória do Python a partir de um despejo de núcleo. Scripts de análise de memória semelhantes podem ser possíveis para objetos C ++.

Leia também link

    
por 11.08.2010 / 11:21
1

Para o Solaris, há várias ferramentas listadas nas respostas de essa pergunta do StackOverflow (eles incluem verificação de vazamentos com outras formas de acesso a memória ruim).

    
por 11.08.2010 / 07:21
1

Eu tenho feito Objective-C há algum tempo, e há um analisador que lida com o gerenciamento de memória no nível C e coisas assim. O Clang Static Analyzer é tão bom que a Apple decidiu empacotá-lo com o xCode IDE. Eu não tenho certeza se isso é bom para a sua pergunta, mas se você está fazendo C, então vale a pena tentar.

    
por 11.08.2010 / 08:17