Como posso saber se meu código gerenciado está vazando memória devido a chamadas de biblioteca nativas?
-
05-07-2019 - |
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?
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.