¿Volcado de núcleo sin bloqueo en Linux?

24

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 gdbse 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 gdbpara 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?

Craig Ringer
fuente
Lamento que solo pueda dar un único voto a favor de esta maravillosa pregunta.
Peter dice que reinstalar a Mónica el
Excelente pregunta y yo, por mi parte, espero la respuesta. +1 de mi parte
gracias
1
¿Qué pasa con 1) adjuntar el proceso con gdb 2) dejar que se bifurque con un comando de "bifurcación de llamada" 3) descargar el núcleo del proceso hijo 4) dejar que el niño muerto sea esperado por el padre (otra "llamada esperar4") 5 ) separarse del proceso 6) automatizar 1-5? Gdb utiliza llamadas simples al sistema sys_ptrace (), podría ser una herramienta C no realmente compleja totalmente independiente de la gdb.
Peter dice que reinstale a Mónica el
1
En una máquina virtual, podría tomar una instantánea y mostrarla como un clon para analizar. Quizás una de las herramientas enumeradas aquí lo ayudará: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni
1
Puede evitar la segunda interrupción haciendo que el proceso secundario también se bifurque y luego salga. Luego, el proceso padre puede esperar al hijo inmediatamente y luego continuar, mientras el abuelo voltea el núcleo.
kasperd

Respuestas:

1

Google CoreDumper me viene a la mente. Hace una copia de copia en escritura del espacio de direcciones del proceso, vea WriteCoreDump () (vea "Notas").

EricM
fuente
¡Eso se ve extremadamente útil! Me pregunto cuál es la técnica subyacente utilizada. Presumiblemente sigue el proceso, pero la creación de la instantánea CoW sin bifurcación y de una manera que no afecte a la (s) pila (s) sería un desafío. Tendré que echar un vistazo al código. Gran consejo
Craig Ringer el
Parece que solo está en proceso, desafortunadamente, y no se puede invocar a través de gdb o similar, ya que requiere un seguimiento propio. Por lo tanto, es un poco como la DLL debughelp en Windows, en lugar de como un gcore sin bloqueo, pero sigue siendo muy útil. Supongo que sería posible usarlo a través de un enlace LD_PRELOAD y configurar un controlador de señal con gdb, detach y señalar el proceso, pero no parece que esté realmente diseñado para volcar programas no modificados, y tiene el problema compartido por cualquier herramienta de volcado en proceso que si el proceso está lo suficientemente desordenado, el volcado no funcionará.
Craig Ringer el
Lo siento ... Me perdí el bit "no intrusivo" cuando leí la pregunta por primera vez.
EricM