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.

Hemant
fonte
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

Michael Mrozek
fonte
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
7

Valgrind é incrivelmente útil.

jacksonh
fonte
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

elmarco
fonte
1

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

alanc
fonte
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.

phunehehe
fonte
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