Vider le cœur du processus sans tuer le processus

12

Existe-t-il un moyen d'obtenir un vidage de mémoire (ou quelque chose de similaire) pour un processus sans réellement tuer les processus? J'ai un processus python multithread exécuté sur un système embarqué. Et je veux pouvoir obtenir un instantané du processus dans des conditions normales (c'est-à-dire avec les autres processus requis pour être en cours d'exécution), mais je n'ai pas assez de mémoire pour connecter gdb (ou l'exécuter sous gdb) sans le processus python étant le seul à courir.

J'espère que cette question est logique.

Falmarri
la source
Si ce n'est que pendant le débogage, avez-vous pensé à quelque chose de fou comme l'échange sur un fichier NFS ou un périphérique de blocage de réseau?
Gilles 'SO- arrête d'être méchant'

Réponses:

13

L'astuce habituelle est d'avoir quelque chose (peut-être un signal comme SIGUSR1) déclencher le programme fork(), puis l'enfant appelle abort()pour se faire vider le noyau.

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

et lors de l'initialisation

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

Utilisé de cette façon, forkne consommera pas beaucoup de mémoire supplémentaire car presque tout l'espace d'adressage sera partagé (c'est aussi pourquoi cela fonctionne pour générer le vidage de mémoire).

Il était une fois cette astuce utilisée avec un programme appelé undumppour générer un exécutable à partir d'un core dump pour sauvegarder une image après une initialisation complexe; emacspermet de générer une image préchargée à partir de temacs.

geekosaure
la source
5

Vous pouvez essayer d'utiliser gcore. C'est une option pour toi?

Leonid
la source
À un moment donné, gcore était un programme autonome, mais je ne pense plus qu'il fasse partie du paquet gdb - cependant vous pouvez exécuter gdb --pid = <PID> puis utiliser sa commande gcore pour vider un fichier core. gcore.c est un programme assez simple qui est facilement googlable si vous voulez quelque chose de plus léger.
synthesizerpatel