Estoy buscando una manera de tomar un núcleo no intrusivo de un proceso en ejecución en Linux.
Estoy familiarizado con los gdb gcore
, pero eso solo se puede ejecutar cuando gdb
se adjunta al proceso y se detiene para la depuración. Para un volcado de núcleo grande que podría significar muchos segundos, o incluso unos pocos minutos, de ejecución interrumpida.
¿Hay alguna alternativa sin bloqueo?
Linux admite memoria de copia en escritura, de la que depende para soportar fork()
sin ella exec()
. Así que estoy pensando en algo a nivel de kernel donde el kernel toma una instantánea de copia en escritura de las tablas de la página del proceso que se está volcando, luego escribe el núcleo mientras el proceso original continúa ejecutándose.
Estoy bastante seguro de que podría usarlo gdb
para forzar un fork()
volcado del niño mientras el padre continúa felizmente, luego wait()
en el padre para cosechar al niño después de la terminación. Sin embargo, es desordenado y aún requiere dos interrupciones del proceso principal, aunque breves.
¿Seguramente alguien ha necesitado esto antes?
Respuestas:
Google CoreDumper me viene a la mente. Hace una copia de copia en escritura del espacio de direcciones del proceso, vea WriteCoreDump () (vea "Notas").
fuente