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.


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


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


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


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).


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.