Core dump non bloccante su Linux?


24

Sto cercando un modo per prendere un coredump non intrusivo di un processo in esecuzione su Linux.

Ho familiarità con gdb gcore, ma questo può essere eseguito solo quando gdbè collegato al processo ed è interrotto per il debug. Per un grosso core dump che potrebbe significare molti secondi, o anche pochi minuti, di esecuzione interrotta.

Esiste un'alternativa non bloccante?

Linux supporta la memoria copy-on-write, su cui si basa per supportare fork()senza exec(). Quindi sto pensando a qualcosa a livello di kernel in cui il kernel esegue un'istantanea copia-scrittura delle tabelle delle pagine del processo del processo in fase di dump, quindi scrive il core mentre il processo originale continua a funzionare.

Sono abbastanza sicuro che potrei usare gdbper forzare fork()quindi a scaricare il bambino mentre il genitore continua felicemente, quindi wait()nel genitore per raccogliere il bambino dopo la fine. È disordinato, tuttavia, e richiede ancora due interruzioni del processo genitore, anche se brevi.

Sicuramente qualcuno ne aveva bisogno prima?


Mi dispiace di poter dare un solo voto per questa meravigliosa domanda.
Peter dice di ripristinare Monica l'

Ottima domanda e, per uno, non vedo l'ora di rispondere. +1 da me
thanasisk

1
Che dire di 1) allegare il processo con gdb 2) lasciare che sia biforcato da un comando "call fork" 3) scaricare il nucleo del processo figlio 4) lasciando che il figlio morto sia aspettato dal genitore (un altro "call wait4") 5 ) staccare dal processo 6) automatizzare 1-5? Gdb usa semplici chiamate di sistema sys_ptrace (), potrebbe essere uno strumento C non molto complesso totalmente indipendente da gdb.
Peter dice di reintegrare Monica l'

1
Su una macchina virtuale è possibile acquisire un'istantanea e visualizzarla come un clone da analizzare. Forse uno degli strumenti elencati qui ti aiuterà: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni,

1
È possibile evitare la seconda interruzione facendo in modo che anche il processo figlio esegua il fork e quindi esca. Quindi il processo genitore può attendere immediatamente il figlio e quindi continuare, mentre il nonno scarica il core.
Kasperd,

Risposte:


1

Mi viene in mente Google CoreDumper . Crea una copia copy-on-write dello spazio degli indirizzi del processo, vedi WriteCoreDump () (vedi "Note").


Sembra estremamente utile! Mi chiedo quale sia la tecnica di base utilizzata. Presumibilmente gestisce il processo, ma la creazione dell'istantanea CoW senza biforcazione e in un modo che non influisca sullo stack (s) sarebbe difficile. Dovrò dare un'occhiata al codice. Ottimo consiglio
Craig Ringer,

Sfortunatamente sembra solo in fase di elaborazione e non può essere invocato tramite gdb o simili perché richiede ptrace per sé. Quindi è un po 'come la DLL debughelp su Windows, piuttosto che come un gcore non bloccante, ma comunque molto utile. Immagino che sarebbe possibile utilizzare tramite un hook LD_PRELOAD e l'installazione di un gestore di segnale con gdb, scollegare e segnalare il processo, ma non sembra che sia davvero progettato per scaricare programmi non modificati e ha il problema condiviso da qualsiasi strumento di dump in-process che se il processo è abbastanza incasinato il dump non funzionerà.
Craig Ringer,

Scusa ... mi sono perso il bit "non invadente" quando ho letto la domanda per la prima volta.
EricM,
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.