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 (de 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 com apenas um depurador é muito difícil.


2
Pessoalmente, acho que essa pergunta está mais relacionada à programação do que ao unix.
phunehehe

Respostas:


12

Se você pode alterar o código fonte, o Dmalloc é ótimo; ele listará quais ponteiros não foram liberados e (para código criado 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 possui muito mais recursos e não envolve a adição de chamadas dmalloc ao seu código


O dmalloc não tem muito desempenho conforme o esperado em sistemas muito grandes. valgrind é uma aposta melhor, e até lá você vai bater gargalos ...

valgrind --tool memcheck "yourapp" fornecerá informações relacionadas à memória em tempo de execução (útil em sistemas de desktop). Outra ótima ferramenta é o memwatch, mas deve ser compilado junto com sua fonte. O Memwatch pode registrar detalhes em um arquivo, portanto, mais adequado para sistemas embarcados.
rajaganesh87


2

O maciço (da 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-la.

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 for escrito em um idioma diferente, pode ser mais complicado. Recentemente, alguns GDB ganharam capacidade de script e as pessoas começaram projetos interessantes como o gdb-heap , que pode analisar a memória Python a partir de um dump principal. Scripts de análise de memória semelhantes podem ser possíveis para objetos C ++.

Leia também /programming/2564752/examining-cc-heap-memory-statistics-in-gdb



1

Eu pratico o 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. Não tenho certeza se isso é bom para sua pergunta, mas se você estiver fazendo C, vale a pena tentar.


Quibble menor: o clang foi desenvolvido para uso no xcode desde o início. Veja clang.llvm.org/clang_video-05-25-2007.html
Daniel James

Oi Daniel, isso pode ser verdade, mas não foi incluído no xCode até recentemente (ou pelo menos não no pacote I baixado da Apple)
phunehehe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.