2009-12-29 13 views
6

Daha önce http://sourceware.org/ml/gdb/2007-06/msg00360.html numaralı telefondan bahsedilmiştir.
Ama hiç kimse bu tür bir fikri gerçekten uygulamamış görünüyor.
Bunu gerçekleştirmenin önünde herhangi bir engel var mı?Gdb'nin çökmüş bir programa eklenmesi için birisi libsegfault.so ve gdbserver'ı entegre edip etmediğini bilen var mı?

Benim gereksinimleri şunlardır: (. Ex LD_PRELOAD kullanarak)

  1. herhangi elf ikili yürütülebilir eklentisi için güçlü olmak
  2. ikili bir çok iş parçacıklı yürütülebilir
  3. ikili yönlendirebilecek olabilir ana fonksiyonu
  4. içeren bir kütüphane bu x 86 dışında çeşitli işlemci mimarisi (MIPS, KOL, PPC en azından) çalışmalıdır

Eğer zaten böyle bir çözüm varsa, bir bağlantı istedim, ancak henüz değilse, neden zaten bir tekerlek olarak uygulanmadığını bilmek istedim.
Sadece kimse buna gerek duymamış olabilir ... ama bence bu standart olarak hazırlanmakta oldukça faydalıdır.

Sadece bir araya getirmekten başka teknik veya politik bir mesele kodu aranır.

+0

Zaten bir segfault çekirdek dosyası varsa, çekirdek dosyasına gdb veya gdbserver takmak ve debug bilgi alabilirsiniz. Yapmıyorsanız ancak kazayı yeniden üretmeyi biliyorsanız, pid'i ekleyebilir ve segfault'unu izleyebilirsiniz. Bu nasıl/hata ayıklamaya yardımcı olur? –

+0

Sanırım, programın gerçekten çökmesine kadar gdb [sunucu] eklenmiş olmanın ek yüküne sahip olmamanız ve canlı bir görüntüye bakmak yalnızca çekirdek bir çöplükten daha aydınlatıcı olabilir. (Katılmıyorum ama duyguları anlayabiliyorum.) Daha sorunlu bir şekilde, ** sorusu “bu mümkün mü” diye soruyor. ama OP ** beklemek gibi görünüyor ** tam bir çözüm ... – ephemient

cevap

9

Çok zor görünmüyor.

 
$ ./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

Cevabınız için teşekkür ederim, ama bir cevap olarak beklediğim bu değildi. Sanırım "birisi libsegfault.so ve gdbserver'ı entegre ettiyse" diye sorguladım. Bunun nedeninin henüz yapılmadığını ya da libsegfault.so ile gdbserver arasında doğru (yeterli) bir entegrasyon olmasını istedim. Yeterince ayrıntılı ama gereksinimleri olmadığı gerekçesiyle benim soru için üzgünüm : 1. Program 3. programı bir kütüphane bağlantı verebilir bir çok iş parçacıklı program olabilir 2. herhangi bir programa LD_PRELOAD tarafından eklentisi güçlü olmak olduğunu Ana Fonksiyonu İçerir – holmes

+0

Bu, sadece bunu uygulamak için önemli bir engel olduğuna inanmadığımı göstermek için bir konsept kanıtıdır. Bu fikirleri sizin özelliklerine göre uyarlamak zor olmamalı ve burada ihtiyaç duyulan tüm syscalllar uyumsuzdur, bu yüzden çok iş parçacıklı bir programda tamamının olması gerekir. – ephemient

+0

Eh, bence bu açık. Glibc'de bir araya getirmek için başka teknik veya politik bir sorun olabileceğini düşündüm. – holmes