Comment suivre / corriger un problème lié à la mémoire dans un grand code C / C ++ sur les systèmes * nix

9

Quelle stratégie utilisez-vous lors du suivi d'un problème lié à la mémoire? Quels outils utilisez-vous (open source et propriétaire) pour identifier les fuites de mémoire, la corruption de mémoire, etc.? Comment suivriez-vous les fuites de mémoire si seulement gdb / dbx était disponible sur un système?

Pour moi, réparer les fuites de mémoire avec seulement un débogueur est très difficile.

Hemant
la source
2
Personnellement, je pense que cette question est plus liée à la programmation qu'à celle d'Unix.
phunehehe

Réponses:

12

Si vous pouvez changer le code source, Dmalloc est génial; il listera les pointeurs qui n'ont pas été libérés et (pour le code construit avec des symboles de débogage) exactement sur quelle ligne ils ont été alloués.

Si vous ne pouvez pas, Valgrind est à peu près la norme pour ce genre de chose. Je trouve généralement Valgrind un peu plus difficile à utiliser, mais il a beaucoup plus de fonctionnalités et n'implique pas l'ajout d'appels dmalloc dans votre code

Michael Mrozek
la source
dmalloc n'est pas très performant comme prévu dans les très grands systèmes. valgrind est un meilleur pari, et même là, vous rencontrerez des goulots d'étranglement ...
valgrind --tool memcheck "yourapp" donnera des informations relatives à la mémoire lors de l'exécution (utile dans les systèmes de bureau). Un autre excellent outil est memwatch mais il doit être compilé avec votre source. Memwatch peut enregistrer les détails dans un fichier, donc plus adapté aux systèmes embarqués.
rajaganesh87
7

valgrind est incroyablement utile.

jacksonh
la source
2

Le massif (de valgrind) est l'un des meilleurs moyens de détecter les fuites de mémoire. Répétez votre code suspect (ou exécutez votre programme assez longtemps) et videz le résultat avec ms_print. Habituellement, la pile d'appels vous donne suffisamment d'informations pour y remédier.

Avec GDB, vous pouvez essayer de vous attacher à un programme en cours d'exécution et d'appeler des fonctions telles que malloc_stats()

Si votre programme est écrit dans une langue différente, cela pourrait être plus délicat. Récemment, certains GDB ont gagné en scriptabilité, et les gens ont commencé des projets intéressants tels que gdb-heap , qui peut analyser la mémoire Python à partir d'un vidage de mémoire. Des scripts d'analyse de mémoire similaires peuvent être possibles pour les objets C ++.

Lisez aussi /programming/2564752/examining-cc-heap-memory-statistics-in-gdb

elmarco
la source
1

Pour Solaris, plusieurs outils sont répertoriés dans les réponses à cette question StackOverflow (ils incluent la vérification des fuites avec d'autres formes d'accès incorrect à la mémoire).

alanc
la source
1

Je fais de l'Objective-C depuis un certain temps, et il y a un analyseur qui gère la gestion de la mémoire de niveau C et des trucs comme ça. Clang Static Analyzer est si bon qu'Apple a décidé de le regrouper avec leur IDE xCode. Je ne sais pas si cela convient à votre question, mais si vous faites du C, cela vaut la peine d'essayer.

phunehehe
la source
Petit problème: clang a été développé pour être utilisé dans xcode depuis le début. Voir clang.llvm.org/clang_video-05-25-2007.html
Daniel James
Salut Daniel, c'est peut-être vrai, mais il n'était pas inclus dans xCode jusqu'à récemment (ou du moins pas dans le pack que j'ai téléchargé d'Apple)
phunehehe