Como posso saber se meu código gerenciado está vazando memória devido a chamadas de biblioteca nativas?

StackOverflow https://stackoverflow.com/questions/244489

Pergunta

Eu tenho uma DLL gerenciada que chama uma biblioteca nativa. Essa biblioteca nativa geralmente retorna intptrs. Eles podem ser transmitidos a outros métodos da biblioteca nativa para fazer as coisas ou para dizer à biblioteca para libertar a instância associada ao INTPTR. Mas apenas algumas das instâncias precisam ser libertadas dessa maneira, outras são gerenciadas pela biblioteca. O problema é que a documentação nem sempre é clara sobre quais instâncias devem ser libertadas e quais não devem.

O que eu quero saber é se existe uma maneira de saber se meu código manteve referências a algum dos ponteiros que devem ser libertados e, portanto, está fazendo com que a memória vaze?

Foi útil?

Solução

A maneira mais fácil é provavelmente usar um perfilador de memória. Um rápido Google apareceu um link para MEMPROFILER. Eu usei isso uma vez (como teste) e pude encontrar lugares onde não estava descartando corretamente os diretórios. Tenho certeza de que existem outros, incluindo isso 1 por Redgate.

Outras dicas

Eu uso o windbg (está disponível aqui). Sua linha de comando acionada, mas fornece muitos relatórios bons incluem informações de pilha, número de objetos e tamanho tirado (isso pode ajudar a apontar para itens que não estão sendo descartados).

Há também a ferramenta de diagnóstico de depuração que possui relatórios específicos para a memória e manipular vazamentos. Seu aqui

Você pode querer considerar usar Safehandles Para embrulhar as alças retornadas do código nativo. Ele fornece algum valor adicional sobre um intptr.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top