2012-07-16 13 views
5

Estoy leyendo el libro "Interfaces e implementaciones C" de David Hanson. Este ejercicio preguntas parece interesante y soy incapaz de encontrar una solución:Invocando el depurador desde un programa C

En algunos sistemas, un programa puede invocar un depurador en sí mismo cuando se ha detectado un error . Esta función es particularmente útil durante el desarrollo , cuando las fallas de aserción pueden ser comunes.

Puede proporcionar un breve ejemplo de cómo invocar un depurador.

void handle_seg_fault(int arg) 
{ 
    /* how to invoke debugger from within here */ 
} 

int main() 
{ 
    int *ptr = NULL; 
    signal(SIGSEGV, handle_seg_fault); 
    /* generate segmentation fault */ 
    *ptr = 1; 
} 
+0

Hagas lo que hagas, asegúrate de utilizar solo [funciones de seguridad de señal asíncrona] (http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html) desde tu manejador de señal. Por ejemplo, de todas las variantes de 'exec', solo' execve' y 'execle' son seguros de ejecutar en el contexto de un controlador de señal (captura de señal asíncrona). Ahora bien, si en general es prudente hacerlo (frente a una "canción corruptora del estado" como SIGSEGV) es otra cosa. Me gustaría ir con (a) un depurador externo o (b) inspeccionar el post mortem del coredump. –

Respuesta

4

Abundando en el comentario de Christian.K, fork() ing un depurador en la cara de algo así como un SIGFPE o SIGSEGV podría no ser la mejor de las ideas, porque. ..

  1. su programa es potencialmente corrupto, por lo que el fork() no es seguro;
  2. es posible que desee utilizar algo diferente para la depuración de lo que el programa ha codificado;
  3. el usuario promedio de la aplicación no sabe cómo manejar un depurador;
  4. Cualquiera competente con un depurador usualmente prefiere el coredump sobre el depurador auto-invocado.

Un coredump que puedo copiar en un banco de pruebas supera una instancia de depurador en el lugar de trabajo de mi cliente a cualquier hora del día. Una interfaz de depurador genera un mensaje de error pésimo para el usuario final.

+0

Creo que es una buena idea usar la conexión del depurador solo por razones de depuración. –

3

tengo esto:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 
#include <string.h> 
#include <errno.h> 

void exception_handler(int) 
{ 
    int pid = getpid(); 
    if (fork() != 0) { 
     while(true) sleep(1000); 
    } 
    char buf[20]; 
    sprintf(buf, "--pid=%u", pid); 
    execlp("gdb", "gdb", buf, NULL); 
    exit(-1); 
} 

int init() 
{ 
    if (signal(SIGSEGV, exception_handler) < 0) { 
     return errno; 
    } 
    if (signal(SIGILL, exception_handler) < 0) { 
     return errno; 
    } 
    if (signal(SIGFPE, exception_handler) < 0) { 
     return errno; 
    } 
    return 0; 
} 

int main() 
{ 
    if (int rc = init()) { 
     fprintf(stderr, "init error: %s\n", strerror(rc)); 
     return 1; 
    } 
    *((char*)(0)) = 1; 
} 
+0

Gracias por su ayuda. – user138645

Cuestiones relacionadas