Scarica il core del processo senza uccidere il processo


12

C'è un modo per ottenere un core dump (o qualcosa di simile) per un processo senza uccidere effettivamente i processi? Ho un processo Python multithread in esecuzione su un sistema incorporato. E voglio essere in grado di ottenere un'istantanea del processo in condizioni normali (cioè con gli altri processi necessari per essere eseguiti), ma non ho memoria sufficiente per connettere gdb (o eseguirlo sotto gdb) senza il processo python essere l'unico in esecuzione.

Spero che questa domanda abbia un senso.


Se questo è solo durante il debug, hai considerato qualcosa di folle come lo scambio su un file NFS o un dispositivo di blocco di rete?
Gilles 'SO- smetti di essere malvagio' il

Risposte:


13

Il solito trucco è avere qualcosa (possibilmente un segnale simile SIGUSR1) che fa scattare il programma fork(), quindi il bambino chiama abort()per farsi scaricare il core.

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

e durante l'inizializzazione

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

Se utilizzato in questo modo, forknon consumerà molta memoria aggiuntiva perché verrà condiviso quasi tutto lo spazio degli indirizzi (motivo per cui funziona anche per generare il dump principale).

Un tempo questo trucco veniva usato con un programma chiamato undumpper generare un eseguibile da un dump core per salvare un'immagine dopo una complessa inizializzazione; emacsusato per fare questo per generare un'immagine precaricata da temacs.


5

Potresti provare a usare gcore. È un'opzione per te?


Ad un certo punto gcore era un programma autonomo ma non credo più che faccia parte del pacchetto gdb - tuttavia puoi eseguire gdb --pid = <PID> e quindi usare il suo comando gcore per scaricare un file core. gcore.c è un programma abbastanza semplice che è facilmente googlabile se si desidera qualcosa di più leggero.
synthesizerpatel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.