Como testar fugas de memória?

Temos uma aplicação com centenas de possíveis acções do utilizador, e pensa em como melhorar o teste de 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?
Author: sthiers, 2009-01-07

5 answers

Que língua?

Eu usaria uma ferramenta como o Valgrind, tentaria exercer completamente o programa e ver o que ele relata.

 4
Author: Draemon, 2009-01-07 15:09:22
Primeira linha de defesa:
  • Verifique a lista com memória comum erros relacionados com a atribuição para programadores
  • directrizes de codificação
Segunda linha de defesa:
  • 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.

 2
Author: aku, 2009-01-07 15:18:40
Parece-me que o cerne do problema não é tanto encontrar fugas de memória como saber quando testá-las. Você diz que tem muitas ações do usuário, mas não diz O que sequências de ações do usuário são significativas. Se conseguires gerar sequências significativas ao acaso, eu discutiria muito por testes aleatórios. Em testes aleatórios você mediria
  • cobertura do código (com gcov ou valgrind)
  • 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 correr valgrind 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!
 1
Author: Norman Ramsey, 2009-01-08 00:13:21
Na minha empresa, programámos um caminho de acção sem fim para a nossa aplicação. O coletor de lixo java deve limpar todos os mapas e listas não utilizados e algo assim. Então nós deixamos a aplicação começar com o caminho de ação sem fim e olhar, se o tamanho de uso da memória está crescendo.

Verifique quais os campos que não são apagados pode usar o 'JProfiler' para o Java.

 0
Author: Markus Lausberg, 2009-01-07 15:02:44

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).
 0
Author: borx, 2013-09-29 17:25:37