Volcar el núcleo del proceso sin matar el proceso

12

¿Hay alguna manera de obtener un volcado de núcleo (o algo similar) para un proceso sin realmente matar los procesos? Tengo un proceso de Python multiproceso que se ejecuta en un sistema integrado. Y quiero poder obtener una instantánea del proceso en condiciones normales (es decir, con los otros procesos necesarios para ejecutarse), pero no tengo suficiente memoria para conectar gdb (o ejecutarlo bajo gdb) sin el proceso de Python siendo el único corriendo

Espero que esta pregunta tenga sentido.

Falmarri
fuente
Si esto es solo mientras está depurando, ¿ha considerado algo loco como el intercambio en un archivo NFS o un dispositivo de bloqueo de red?
Gilles 'SO- deja de ser malvado'

Respuestas:

13

El truco habitual es hacer que algo (posiblemente una señal como SIGUSR1) active el programa fork(), luego el niño llama abort()para volcarse el núcleo.

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

y durante la inicialización

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

Si se usa de esta manera, forkno se consumirá mucha memoria adicional porque se compartirá casi todo el espacio de direcciones (razón por la cual esto también funciona para generar el volcado del núcleo).

Érase una vez este truco se usó con un programa llamado undumppara generar un ejecutable desde un volcado de núcleo para guardar una imagen después de una inicialización compleja; emacssolía hacer esto para generar una imagen precargada de temacs.

geekosaur
fuente
5

Puedes intentar usarlo gcore. esa es una opción para ti?

Leonid
fuente
En algún momento, gcore era un programa independiente, pero ya no creo que sea parte del paquete gdb; sin embargo, puede ejecutar gdb --pid = <PID> y luego usar su comando gcore para volcar un archivo central. gcore.c es un programa bastante simple que se puede buscar fácilmente en Google si quieres algo más liviano.
sintetizadorpatel