Quiero un programa en 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 es fácil de detener y reiniciar para ajustar otros tipos de código de depuración. También, ya que es en un entorno de producción, no quiero llamar a abort(). Las cuestiones objeto de investigación no son fácilmente replicado en un entorno no productivo. Lo que me gustaría es que el programa, cuando se detecta ciertas cuestiones, para producir un volcado de núcleo en su propio, preferiblemente con la información suficiente para cambiar el nombre del archivo y, a continuación, continuar.

InformationsquelleAutor Joshua Swink | 2008-09-25

5 Comentarios

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

    Tenedor el proceso después del accidente, el niño – que voy a dar una instantánea cada vez que desea

    • Ooohh, que es muy ingenioso – siempre he tenido que subir(6) y reiniciar el proceso.
    • Esto mata a los padres. El niño regresa a 0 de fork().
    • Puedo utilizar este método para generar un core dump cuando el manejo de una violación de segmento de la señal de una vez, pero no quiero terminar? Me gustaría escribir un programa en pantalla completa, y todavía estoy a la ponderación de mis opciones, sobre cómo manejar los posibles errores sin salir de mi programa, si es que eso es posible.
    • Mi lectura sugiere que una horquilla de niño sólo recibe el subproceso actual, no cualquier otro de los hilos. Esto significa que su core dump sólo contienen información sobre el subproceso actual y no en ninguna otra hilos que se estén ejecutando. Si usted necesita todos los hilos que usted podría ser capaz de utilizar este: code.google.com/p/google-coredumper
    • Si abortar doesnt retorno de por qué o
    • ¿Cuál es el significado de || (*((void*)0) = 42) ?
    • Es sólo otro (más cómica, menos claro) en el camino de estrellarse el proceso. En concreto, se provoca un fallo de segmentación.
    • No se bifurcan el actual proceso de confundir a otros procesos que dependen de su servicio? Incluso si se bloquea, un http demonio podría recibir solicitudes en el proceso hijo y terminar, posiblemente estrellarse alguna funcionalidad?

  2. 6

    Otra forma podría ser la utilización de la Google Coredumper de la biblioteca. Esto crea un resultado similar a la horquilla+abortar la técnica, pero juega mejor con las aplicaciones multiproceso (suspende todos los hilos de un poco de tiempo antes de que se bifurcan, de modo que no hacer un lío en el niño).

    Ejemplo:

     #include </google coredumper.h> 
    ... 
    WriteCoreDump('core.myprogram'); 
    /* Seguir adelante, hemos generado un archivo de núcleo, 
    * pero no nos choque. 
    */
    
  3. 3

    Sol describe cómo obtener un archivo de núcleo de Solaris, HP-UX, Redhat, y Windows aquí.

    Solaris tiene la gcore programa. HP-UX puede tener.
    De lo contrario, el uso de gdb y su gcore de comandos.
    Windows tiene win-dbg-root\tlist.exe y de ganar-dbg-root\adplus.vbs

  4. 3

    ¿De verdad quieres un núcleo, o simplemente un stacktrace ?
    Si lo que quieres es un stacktrace puedes echar un vistazo en el opensource aquí y tratan de integrar el código de allí, o tal vez sólo llamarlo desde la línea de comandos es suficiente.

    Creo que algo de código en el gdb del proyecto también puede ser útil.

    Otro piensa que usted puede ser que desee 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
  5. 2

    El código fuente para producir un volcado de núcleo está en ‘gcore», que es parte de la gdb paquete.

    También, que el Sol se ha gcore.

    También, usted tiene que tener un proceso independiente que ejecuta el volcado de núcleo, como el proceso actual debe ser suspendido. Usted encontrará los detalles en la gcore de origen, o usted puede simplemente ejecutar su plataforma gcore con su proceso como en el de destino.

Dejar respuesta

Please enter your comment!
Please enter your name here