¿Cómo puede un programa de C producir un volcado central de sí mismo sin terminar?

StackOverflow https://stackoverflow.com/questions/131439

  •  02-07-2019
  •  | 
  •  

Pregunta

Quiero que un programa en C produzca un volcado de datos en determinadas circunstancias. Este es un programa que se ejecuta en un entorno de producción y no se detiene y reinicia 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 bajo investigación no se replican fácilmente en un entorno que no es de producción. Lo que me gustaría es que el programa, cuando detecte ciertos problemas, produzca un volcado de memoria por su cuenta, preferiblemente con suficiente información para cambiar el nombre del archivo y luego continuar.

¿Fue útil?

Solución

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

Bifurque el proceso y luego bloquee al niño: le dará una instantánea cuando lo desee

Otros consejos

Otra forma podría ser usar 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 por un tiempo antes de forzarlos para que no hagan un desastre en el niño).

Ejemplo:

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

Sun describe cómo obtener un archivo principal en Solaris, HP-UX, Redhat y Windows here .

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

¿Realmente quieres un núcleo, o simplemente un stacktrace? Si todo lo que quieres es un stacktrace, puedes echar un vistazo a la página de acceso aquí e intentar integrar el el código desde allí, o tal vez simplemente llamarlo 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 podrías hacer es usar gdb para adjuntar a un proceso en ejecución.

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

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

Además, el Sol tiene gcore .

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top