Débogage léger de fuite de mémoire sur Linux
J'ai regardé pour les réponses d'abord et vu que Valgrind tout le monde est l'outil de prédilection pour les fuite de mémoire de débogage sur linux. Malheureusement Valgrind ne semble pas fonctionner pour mes fins. Je vais essayer d'expliquer pourquoi.
Contraintes:
- La fuite ne se reproduisent que dans l'environnement du client. En raison de certaines
restrictions légales, nous devons travailler avec les binaires. Pas reconstruit. - Régulièrement de l'environnement de notre application consomme environ 10% de l'UC. Dire, nous pouvons
tolérer jusqu'à 10x utilisation du PROCESSEUR augmente. Valgrind par défaut memcheck
paramètres n'bien pire faire de notre application qui ne répond pas pour longtemps
périodes de temps.
Ce dont j'ai besoin est un équivalent de Microsoft UMDH: activer le suivi de pile pour chaque allocation de tas, puis à certain point de temps de vidage de toutes les allocations regroupés par des piles et ordonné par le nombre d'allocations dans l'ordre décroissant. Notre application navires à la fois sur Windows et plates-formes Linux, donc je sais que les performances sur Windows sous UMDH est encore supportable.
Ici sont les outils/méthodes j'ai considéré
- Valgrind's -memcheck et –massif outils qu'Ils font beaucoup plus que nécessaire (comme la numérisation de tout le processus de la mémoire pour chaque allocation
pointeur), ils sont trop lents, et ils ne comprennent toujours pas faire exactement ce que je
besoin (vidage de piles d'appels triés par compte), donc je vais écrire certaines
les scripts d'analyse de la sortie - dmalloc bibliothèque (dmalloc.com) nécessite de nouvelles binaires
- LeakTracer (http://www.andreasen.org/LeakTracer/) ne Fonctionne qu'avec C++
de new/delete (j'ai besoin de malloc/free), n'a pas de groupe-par-pile
et des fonctionnalités de tri - La mise en œuvre de l'outil de moi .si la bibliothèque à l'aide de LD_PRELOAD
mécanisme
(Primordial 'malloc' à l'aide du mécanisme de LD_PRELOAD)
Qui va prendre au moins une semaine compte tenu de mon codage-pour-Linux compétences et il se sent
comme inventer une bicyclette.
Ai-je raté quelque chose? Y a-léger Valgrind options existantes ou LD_PRELOAD outil?
source d'informationauteur glagolig
Vous devez vous connecter pour publier un commentaire.
GNU libc a intégré la fonction malloc de débogage:
http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html
Utilisation LD_PRELOAD pour appeler
mtrace()
à partir de votre propre .donc:Le compiler avec:
L'exécuter avec:
Plus tard, vérifier le fichier de sortie:
Et vous obtiendrez quelque chose comme:
Bien sûr, n'hésitez pas à écrire votre propre malloc crochets qui dump l'ensemble de la pile (l'appel de backtrace() si vous pensez que ça va aider).
Numéros de lignes et/ou les noms de fonction sera disponible si vous avez conservé les informations de débogage pour le binaire quelque part (par exemple, le binaire a certaines informations de débogage intégré, ou vous n'avez
objcopy --only-keep-debug my-leaky-program my-leaky-program.debug
).Aussi, vous pouvez essayer de Boehm GC, il fonctionne comme un détecteur de fuite de trop:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
Je voudrais annoncer ma juste annoncé heaptrack utilitaire, qui devrait être juste ce que vous où la recherche de l'époque. Vous pouvez trouver plus d'informations ici: http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux
Par rapport à votre heapwatch outil, la performance devrait être beaucoup mieux, comme je l'ai utiliser libunwind et plus tard libbacktrace pour retarder l'annotation de la backtrace avec NAIN informations de débogage.
J'aimerais obtenir plus de commentaires sur elle, afin de l'essayer!
MemoryScape serait de répondre à vos besoins. C'est la mémoire dynamique outil de débogage qui vient avec le TotalView débogueur.
http://www.roguewave.com/products/memoryscape.aspx
memleax devrait fonctionner pour vous.
Il débogue fuite de mémoire d'un processus en cours d'exécution, en l'attachant, sans recompilation du programme ou du redémarrage du processus cible. C'est très pratique et adapté à l'environnement de production.
Il Casiers uniquement pour malloc/free() appelle, il devrait donc apporter moins de performance de l'impact que Vagrild.
Il fonctionne sur GNU/Linux et FreeBSD x86_64-amd64.
NOTE: je suis l'auteur, toute suggestion est la bienvenue
@glagolig,
Oui, MemoryScape pouvez regrouper des crédits alloués par emplacement de pile.
Avez-vous été en mesure d'obtenir la version d'évaluation? Si vous avez utilisé une adresse e-mail qui ne ressemble pas à un bot, vous devriez avoir entendu parler de nous assez rapidement. Si non, ou si vous rencontrez des problèmes techniques avec il me donner une crier ou de contacter notre support technique de l'équipe.
Chris Gottbrath
Chef de Produit Principal pour TotalView au Rogue Wave Software
e-mail: Prenom . Nom (at) roguewave . com
Étonnamment, j'ai été incapable de trouver quelque chose comme Microsoft UMDH en open-source de domaine ou disponibles en téléchargement immédiat. (J'ai aussi regardé Google Tas De Fuite Checker mais il est plus comme Valgrind plutôt que de UMDH). Donc j'ai fini par écrire l'outil de moi-même à l'aide de malloc instrumentation projet en tant que point de référence:
https://github.com/glagolig/heapwatch
L'outil a un certain nombre de limites, mais il a très bien fonctionné pour mes fins.
Il est un outil gratuit open source appelé chap qui aura le plus de ce que vous voulez. Concrètement, il ne vous donnera pas les traces de pile, mais c'est un poids extrêmement léger de l'outil car il n'exige pas de toute l'instrumentation. Tous vous avez besoin est de pouvoir prendre un live cœur du processus en question, à un point où vous pensez que le processus a déjà exposé le bug (si vous croyez qu'il a fui ou qui est trop grand ou autre).
Pour plus de détails, voir https://github.com/vmware/chap