Como testar fugas de memória?
Atualmente, é assim que acontece: ao testar manualmente o software, se parece que a nossa aplicação consome demasiada memória, usamos uma ferramenta de memória, encontramos a causa e corrigimo-la. É um processo bastante lento e não eficiente: os problemas são descobertos tarde e depende da boa vontade de um desenvolvedor.
Como podemos melhorar aquilo?- verifique internamente se algumas acções (como" close file") recuperam alguma memória e registam-na? Afirmar no estado de memória dentro dos testes da nossa unidade (mas parece que seria uma tarefa tediosa) ?
- verifica-o manualmente de vez em quando?
- inclui essa verificação cada vez que uma nova história de Utilizador é implementada?
5 answers
Que língua?
Eu usaria uma ferramenta como o Valgrind, tentaria exercer completamente o programa e ver o que ele relata.
- Verifique a lista com memória comum erros relacionados com a atribuição para programadores
- directrizes de codificação
- revisão de códigos
- static code analyis (como parte do processo de compilação)
- ferramentas de análise de memória
Se você trabalha com uma linguagem não gerenciada (como C/C++), você pode eficientemente descobrir a maioria das fugas de memória, sequestrando funções de gerenciamento de memória. Por exemplo, você pode rastreie todas as alocações de memória.
- cobertura do código (com
gcov
ouvalgrind
) - utilização da memória (com
valgrind
) - cobertura das próprias acções do utilizador
Por "cobertura das acções do utilizador" quero dizer afirmações como as seguintes:
- para cada par de acções A E B, Se houver uma sequência significativa de acções em que A é imediatamente seguida de B, então testamos essa sequência.
Se isso não é verdade, então você pode perguntar que fração dos pares A E B é verdade.
Se tivesses os ciclos da CPU para pagar, Farias isso. provavelmente também beneficiar de corrervalgrind
ou outra ferramenta de verificação de memória antes de cada commit para o seu repositório de código fonte ou durante uma compilação noturna.
Automatizar!
Verifique quais os campos que não são apagados pode usar o 'JProfiler' para o Java.
Substituir novo e apagar com as suas versões personalizadas e registar todos os actos de atribuição/desallocação.
De um modo geral (não se trata de testes, mas sim de combater a questão na sua origem), os smartpointers ajudam a evitar este problema. Felizmente, a norma C++11 oferece novas classes de ponteiros inteligentes convenientes(shared_ptr
, unique_ptr
).