Existe-t-il un moyen, je peux trouver la fuite de mémoire d'un processus en cours? Je peux utiliser Valgrind pour trouver des fuites de mémoire avant le début d'un processus. Je peux utiliser GDB pour l'attacher à un processus en cours. Comment pourrais-je déboguer une fuite de mémoire d'un processus en cours?
c
gdb
memory-leaks
howtechstuffworks
la source
la source
Réponses:
Voici les étapes presque garanties pour trouver qui fuit la mémoire:
Découvrez le PID du processus qui provoque la fuite de mémoire.
capturer le
/proc/PID/smaps
et enregistrer dans un fichier commeBeforeMemInc.txt
./proc/PID/smaps
et l'enregistrer aafterMemInc.txt
trouver la différence entre le premier
smaps
et le deuxièmesmaps
, par exemple avecdiff -u beforeMemInc.txt afterMemInc.txt
notez la plage d'adresses où la mémoire a été augmentée, par exemple:
utiliser GDB pour vider la mémoire sur le processus en cours ou obtenir le coredump en utilisant
gcore -o process
J'ai utilisé gdb lors de l'exécution du processus pour vider la mémoire dans un fichier.
maintenant, utilisez la
strings
commande ouhexdump -C
pour imprimer ledump_outputfile.dump
Vous obtenez un formulaire lisible où vous pouvez localiser ces chaînes dans votre code source.
Analysez votre source pour trouver la fuite.
la source
Je pense que memleax est exactement ce que vous voulez.
Il débogue la fuite de mémoire d'un processus en cours d'exécution en l'attachant, sans recompiler le programme ni redémarrer le processus cible. C'est très pratique et adapté à l'environnement de production.
Il fonctionne sur GNU / Linux et FreeBSD.
REMARQUE: je suis l'auteur, toute suggestion est la bienvenue
== EDIT ==
J'écris un autre outil libleak , qui accroche les fonctions mémoire par LD_PRELOAD.
Il n'est pas non plus nécessaire de modifier le programme cible. Bien que vous deviez redémarrer la progression avec LD_PRELOAD, vous pouvez activer / désactiver la détection pendant l'exécution.
Il y a beaucoup moins d'impact sur les performances, car aucun piège de signal.
Comparé à des outils similaires (tels que mtrace), il imprime la pile complète d'appels à un point de fuite de mémoire suspect.
la source
Sous Linux, vous pouvez activer mtrace dans votre programme, mais c'est un changement de code.
Sur OpenBSD, vous pouvez essayer les statistiques malloc .
Le vérificateur de fuite de Google pourrait également valoir le coup d'œil, et contrairement à mtrace, vous pouvez être en mesure d'utiliser
LD_PRELOAD
pour éviter la recompilation.la source
Je pense que sans fournir de support pour la surveillance d'allocation après le démarrage du programme directement dans le code source, vous n'avez pas de chance. Voici deux raisons auxquelles je peux penser:
Si, toutefois, votre programme s'exécute à l'intérieur d'une machine virtuelle, cet environnement peut prendre en charge la surveillance des allocations. Je sais que Java dispose de plusieurs outils de surveillance d'allocation et de récupération de place (comme visualVM ) qui se connectent aux programmes en cours d'exécution ou aux machines virtuelles.
la source
Purify d'IBM est probablement l'outil le plus ancien et le plus sophistiqué de tous. Il marquera le numéro de ligne dans le code qui provoque la fuite de mémoire.
la source