2009-12-29 5 views
6

È menzionato in http://sourceware.org/ml/gdb/2007-06/msg00360.html prima.
Ma nessuno sembrava aver effettivamente implementato questo tipo di idea.
Esistono ostacoli per la realizzazione di questo?Qualcuno sa se qualcuno ha integrato libsegfault.so e gdbserver al fine di ottenere gdb collegato al volo ad un programma bloccato?

miei requisiti sono i seguenti: (. Es utilizzando LD_PRELOAD)

  1. Essere in grado di plugin per qualsiasi binario eseguibile elfo
  2. Il binario può essere un multithreading eseguibile
  3. Il binario può collegare a una libreria che contiene la funzione principale
  4. Questo dovrebbe funzionare in varie architetture cPU diversa x86 (MIPS, ARM, PPC almeno)

Quindi, se c'è già una soluzione come questa, volevo un collegamento, ma se non c'è ancora, volevo sapere perché non è già implementato come una ruota.
Potrebbe essere solo che nessuno non ne aveva bisogno ... ma penso che questo sia abbastanza utile da preparare come standard.

Qualsiasi problema tecnico o politico diverso dal semplice assemblaggio del codice è desiderato.

+0

Se si dispone già di un file core segfault, è possibile collegare il gdb o gdbserver al file core e ottenere le informazioni di debug. Se non lo fai, ma sai come riprodurre l'incidente, puoi collegare il pid e guardarlo in modo predefinito. Come/cosa contribuirà al debugging? –

+0

Suppongo che l'idea di non avere il sovraccarico di avere gdb [server] collegato fino a quando il programma non si blocca effettivamente, e che guardare un'immagine live può essere più illuminante di un semplice core dump. (Non sono d'accordo, ma posso capire il sentimento.) Più problematica, la ** domanda ** chiede "è possibile?" ma OP sembra ** aspettarsi ** una soluzione completa ... – ephemient

risposta

9

Non sembra troppo difficile.

 
$ ./a.out 
Caught signal at 0x400966: Segmentation fault 
Segmentation fault 
$ GDB_COMM=:1024 ./a.out 
Caught signal at 0x400966: Segmentation fault 
Attached; pid = 2369 
Listening on port 1024 
 
$ gdb ./a.out 
Reading symbols from /home/me/a.out...done. 
(gdb) target remote :1024 
Remote debugging using :1024 
#define _XOPEN_SOURCE 500 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <unistd.h> 
static char *gdb_comm; 
static void segv_handler(int sig, siginfo_t *si, void *uc) { 
    pid_t child; 
    char msg[84], pid[20]; 
    char *const argv[] = {"gdbserver", gdb_comm, "--attach", pid, NULL}; 
    sprintf(msg, "Caught signal at %p", si->si_addr); 
    psignal(si->si_signo, msg); 
    if (gdb_comm && *gdb_comm) { 
     switch ((child = fork())) { 
     case 0: 
      sprintf(pid, "%ld", (long)getppid()); 
      execvp(argv[0], argv); 
      perror("Failed to start gdbserver"); 
      _exit(-1); 
     case -1: 
      perror("failed to fork"); 
     default: 
      waitpid(child, NULL, 0); 
      break; 
     } 
    } 
} 
int main(int argc, char **argv) { 
    static struct sigaction segv_action = { 
     .sa_sigaction = segv_handler, 
     .sa_flags = SA_RESETHAND | SA_SIGINFO, 
    }; 
    gdb_comm = getenv("GDB_COMM"); 
    sigaction(SIGILL, &segv_action, NULL); 
    sigaction(SIGFPE, &segv_action, NULL); 
    sigaction(SIGSEGV, &segv_action, NULL); 
    sigaction(SIGBUS, &segv_action, NULL); 
    *(int *)main = 0; 
    return 0; 
} 
+0

Grazie per la risposta, ma questo non è quello che mi aspettavo come risposta. Penso di aver messo in dubbio che "se qualcuno avesse integrato libsegfault.so e gdbserver". Volevo un motivo per cui questo non era ancora stato fatto, o una corretta (adeguata) integrazione tra libsegfault.so e gdbserver. Siamo spiacenti per la mia domanda per non essere abbastanza dettagliato, ma i requisiti sono: 1. Essere in grado di plug-in da LD_PRELOAD a qualsiasi programma 2. Il programma può essere un programma con multithreading 3. Il programma può collegarsi a una libreria che contiene la funzione principale – holmes

+0

Questa è solo una dimostrazione del concetto, per dimostrare che non credo ci siano ostacoli significativi nell'implementazione di questo. Non dovrebbe essere difficile adattare le idee alle tue specifiche, e tutte le syscalls necessarie qui sono async-safe, quindi dovrebbe essere ok in un programma multi-thread. – ephemient

+0

Bene, penso che questo sia ovvio. Ho pensato che potrebbe esserci qualche altro problema tecnico o politico per metterli insieme in glibc. – holmes

Problemi correlati