2008-09-25 9 views
26

Quiero un programa C para producir un volcado de núcleo bajo ciertas circunstancias. Este es un programa que se ejecuta en un entorno de producción y no se puede detener y reiniciar fácilmente para ajustar otros tipos de código de depuración. Además, como está en un entorno de producción, no quiero llamar a abort(). Los problemas investigados no se replican fácilmente en un entorno que no sea de producción. Lo que me gustaría es que el programa, cuando detecta ciertos problemas, produzca un volcado del núcleo por sí mismo, preferiblemente con suficiente información para renombrar el archivo, y luego continúe.¿Cómo puede un programa C producir un volcado de núcleo sin terminar?

Respuesta

53
void create_dump(void) 
{ 
    if(!fork()) { 
     // Crash the app in your favorite way here 
     abort() || (*((void*)0) = 42); 
    } 
} 

Tenedor el proceso a continuación, tirar el niño - que te dan una instantánea cada vez que desee

+0

Ooohh, eso es muy ingenioso - Siempre he tenido que subir (6) y reiniciar el proceso. – paxdiablo

+1

Esto mata al padre. El niño devuelve 0 del tenedor(). –

+0

¿Puedo utilizar este método para generar un volcado de núcleo al manejar una señal segfault una vez, pero no deseo terminar? Me gustaría escribir un programa de pantalla completa, y todavía estoy ponderando mis opciones, sobre cómo manejar posibles errores sin salir de mi programa, si eso es posible. –

1

El código fuente para producir un volcado del núcleo está en 'gcore', que es parte del paquete gdb.

Además, el Sol tiene gcore.

Además, debe tener un proceso separado ejecutando el volcado del núcleo, ya que el proceso actual debe suspenderse. Encontrarás los detalles en la fuente de Gcore, o simplemente puedes ejecutar el gcore de tu plataforma con tu proceso como objetivo.

3

Sun describe cómo obtener un archivo de núcleo en Solaris, HP-UX, Redhat y Windows here.

Solaris tiene el programa gcore. HP-UX puede tenerlo. De lo contrario, use gdb y su comando gcore. Windows tiene win-dbg-root \ tlist.exe y win-dbg-root \ adplus.vbs

3

¿Realmente quiere un núcleo, o simplemente un stacktrace? Si todo lo que quieres es stacktrace, puedes echar un vistazo al opensource here e intentar integrar el código desde allí, o simplemente llamar desde la línea de comandos es suficiente.

Creo que algún código en el proyecto gdb también podría ser útil.

Otra cosa que debería hacer es utilizar gdb para adjuntarlo a un proceso en ejecución.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process 
+0

Nota: la pregunta acerca de la ejecución del BGF desde la propia aplicación: http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from- program-to-print-its-stacktrace –

4

Otra forma podría ser el uso de la biblioteca Google Coredumper. Esto crea un resultado similar a la técnica fork + abort, pero se reproduce mejor con aplicaciones multiproceso (suspende todos los hilos durante un tiempo antes de bifurcar para que no ensucien al niño).

Ejemplo:

 
    #include <google/coredumper.h> 
    ... 
    WriteCoreDump('core.myprogram'); 
    /* Keep going, we generated a core file, 
    * but we didn't crash. 
    */ 
Cuestiones relacionadas