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 gdb
est 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 gdb
pour 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?
Réponses:
Google CoreDumper me vient à l'esprit. Il fait une copie copie sur écriture de l'espace d'adressage du processus, voir WriteCoreDump () (voir "Notes").
la source