Dump core non bloquant sous Linux?

24

Je cherche un moyen de prendre un coredump non intrusif d'un processus en cours d'exécution sur Linux.

Je connais les gdb gcore, mais cela ne peut être exécuté que lorsqu'il gdbest attaché au processus et qu'il est arrêté pour le débogage. Pour un gros vidage de mémoire qui peut signifier plusieurs secondes, voire quelques minutes, d'exécution interrompue.

Existe-t-il une alternative non bloquante?

Linux prend en charge la mémoire de copie sur écriture, dont il dépend pour prendre en charge fork()sans exec(). Je pense donc à quelque chose au niveau du noyau où le noyau prend un instantané de copie sur écriture des tables de pages de processus du processus en cours de vidage, puis écrit le noyau pendant que le processus d'origine continue de s'exécuter.

Je suis presque sûr que je pourrais utiliser gdbpour forcer fork()puis vider l'enfant pendant que le parent continue joyeusement, puis wait()chez le parent pour récolter l'enfant après la fin. C'est désordonné, cependant, et nécessite toujours deux interruptions du processus parent, bien que courtes.

Sûrement que quelqu'un en avait besoin avant?

Craig Ringer
la source
Je suis désolé de ne pouvoir donner qu'un seul vote positif pour cette merveilleuse question.
Peterh dit de réintégrer Monica le
Excellente question et, pour ma part, j'attends avec impatience la réponse. +1 de moi
thanasisk
1
Qu'en est-il de 1) attacher le processus avec gdb 2) le laisser bifurquer par une commande "call fork" 3) vider le cœur du processus enfant 4) laisser l'enfant mort être attendu par le parent (un autre "call wait4") 5 ) se détacher du processus 6) automatiser 1-5? Gdb utilise de simples appels système sys_ptrace (), ce pourrait être un outil C pas vraiment complexe totalement indépendant de la gdb.
Peterh dit de réintégrer Monica le
1
Sur une machine virtuelle, vous pouvez prendre un instantané et l'afficher en tant que clone à analyser. Peut-être que l'un des outils répertoriés ici vous aidera: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni
1
Vous pouvez éviter la deuxième interruption en faisant également bifurquer le processus enfant, puis quitter. Ensuite, le processus parental peut attendre l'enfant immédiatement, puis continuer, tandis que le grand-parent vide le noyau.
Kasperd

Réponses:

1

Google CoreDumper me vient à l'esprit. Il fait une copie copie sur écriture de l'espace d'adressage du processus, voir WriteCoreDump () (voir "Notes").

EricM
la source
Cela semble extrêmement utile! Je me demande quelle est la technique sous-jacente utilisée. Vraisemblablement, il suit le processus, mais la création de l'instantané CoW sans bifurquer et d'une manière qui n'affecte pas la ou les piles serait difficile. Je vais devoir jeter un œil au code. Bon conseil.
Craig Ringer
On dirait qu'il est en cours uniquement, malheureusement, et ne peut pas être invoqué via gdb ou similaire car il nécessite ptrace lui-même. C'est donc un peu comme la DLL debughelp sous Windows, plutôt que comme un gcore non bloquant, mais toujours très pratique. Je suppose qu'il serait possible d'utiliser via un hook LD_PRELOAD et la configuration d'un gestionnaire de signal avec gdb, détacher et signaler le processus, mais il ne semble pas qu'il soit vraiment conçu pour vider des programmes non modifiés, et il a le problème partagé par n'importe quel outil de vidage en cours que si le processus est suffisamment gâché, le vidage ne fonctionnera pas.
Craig Ringer
Désolé… J'ai raté le bit «non intrusif» lorsque j'ai lu la question pour la première fois.
EricM