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

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

Que 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 gdb/dbx estivesse disponível em um sistema?

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

Responder1

Se você pode alterar o código-fonte,Dmallocé ótimo; ele listará quais ponteiros não foram liberados 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. Geralmente acho o Valgrind um pouco mais difícil de usar, mas ele tem muito mais recursos e não envolve a adição de chamadas dmalloc ao seu código

Responder2

valgrind é incrivelmente útil.

Responder3

Maciço(do 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 anexar a um programa em execução e chamar funções comomalloc_stats()

Se o seu programa estiver escrito em uma linguagem diferente, pode ser mais complicado. Recentemente, alguns GDB ganharam capacidade de script e as pessoas iniciaram projetos interessantes comoheap gdb, que pode analisar a memória Python a partir de um core dump. Scripts de análise de memória semelhantes podem ser possíveis para objetos C++.

Leia tambémhttps://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb

Responder4

Eu tenho feito Objective-C há algum tempo, e existe um analisador que lida com gerenciamento de memória de nível C e coisas assim.Analisador Estático Clangé tão bom que a Apple decidiu agrupá-lo com seu IDE xCode. Não tenho certeza se isso é bom para sua pergunta, mas se você estiver fazendo C, vale a pena tentar.

informação relacionada