Comment savoir si mon code géré perd de la mémoire en raison d'appels à des bibliothèques natives?

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

Question

J'ai une dll gérée qui appelle une bibliothèque native. Cette bibliothèque native renvoie généralement IntPtrs. Celles-ci peuvent être transmises à d'autres méthodes de la bibliothèque native pour effectuer certaines tâches ou pour indiquer à la bibliothèque de libérer l'instance associée à IntPtr. Mais seules certaines instances doivent être libérées de cette manière, d'autres sont gérées par la bibliothèque. Le problème est que la documentation ne précise pas toujours quelles instances doivent être libérées et lesquelles ne doivent pas l'être.

Ce que je veux savoir, c'est s'il existe un moyen de savoir si mon code a conservé des références à l'un des pointeurs qui doivent être libérés, ce qui entraîne une fuite de mémoire.

Était-ce utile?

La solution

Le moyen le plus simple consiste probablement à utiliser un profileur de mémoire. Un rapide Google a créé un lien vers MemProfiler . Je l'ai utilisé une fois (à titre d'essai) et j'ai pu trouver des endroits où je ne disposais pas correctement de DirectoryEntries. Je suis sûr qu’il en existe d’autres, notamment cet un de RedGate.

Autres conseils

J'utilise WinDbg ( disponible disponible). Il est géré par la ligne de commande, mais fournit de nombreux bons rapports, notamment des informations sur la pile, le nombre d'objets et la taille prise (cela peut aider à pointer sur des éléments qui ne sont pas supprimés).

Il existe également l’outil de diagnostic de débogage qui contient des rapports spécifiques sur les fuites de mémoire et de descripteurs. Son ici

Vous pouvez envisager d'utiliser SafeHandles pour envelopper les poignées renvoyées par le code natif. Il fournit une valeur supplémentaire par rapport à un IntPtr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top