2012-07-16 14 views
5

Sto leggendo il libro - "C Interfacce e Implementazioni" di David Hanson. Questa domanda esercizio sembra interessante e non riesco a trovare una soluzione:Invocazione del debugger da un programma C

Su alcuni sistemi, un programma può invocare un debugger su se stesso quando ha rilevato un errore. Questa funzione è particolarmente utile durante lo sviluppo , quando i problemi di asserzione possono essere comuni.

Potete fornire un breve esempio su come richiamare un debugger.

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

Qualsiasi cosa tu faccia, assicurati di utilizzare solo [funzioni di sicurezza del segnale asincrono] (http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html) dal tuo gestore di segnale. Ad esempio, di tutte le varianti di 'exec' solo' execve' e 'execle' sono sicure da eseguire nel contesto di un gestore di segnali (che cattura il segnale asincrono). Ora, se è generalmente saggio farlo (di fronte a uno "stato che corrompe il singal" come SIGSEGV) è un'altra cosa. Vorrei andare con (a) un debugger esterno o (b) ispezionare il coredump post mortem. –

risposta

4

Elaborando commento di Christian.K, fork() ing un debugger di fronte a qualcosa di simile a un SIGFPE o SIGSEGV potrebbe non essere la migliore delle idee, perché. ..

  1. il programma è potenzialmente corrotto per iniziare, rendendo il fork() non sicuro;
  2. si potrebbe voler utilizzare qualcosa di diverso per il debug di quanto il programma non sia codificato;
  3. l'utente medio dell'applicazione non sa come gestire un debugger;
  4. competente con un debugger di solito preferisce il coredump sul debugger richiamato automaticamente.

Un coredump che posso copiare su un banco di prova batte un'istanza di debugger sul posto di lavoro del mio cliente in qualsiasi momento della giornata. Un'interfaccia di debugger rende un brutto messaggio di errore per l'utente finale.

+0

Penso che sia una buona idea usare il debugger attach solo per motivi di debug. –

3

ho ottenuto questo:

#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

Grazie per il vostro aiuto. – user138645

Problemi correlati