2013-04-12 4 views

risposta

4

Valgrind supporta separate debug files, quindi è necessario utilizzare answer here e valgrind dovrebbe funzionare correttamente con il file di debug esterno.

+0

E no: non è possibile creare un binario non stonato da uno spogliato (almeno non facilmente). Ma non dovrebbe essere necessario, come afferma correttamente questa risposta. –

+0

Mi dispiace, ma non è chiaro come posso usare questo file di debug con valgrind. Gradirei qualsiasi suggerimento. – cached

+0

Le indicazioni fornite nella "risposta qui" sembrano abbastanza chiare. Costruisci il debuginfo separato, quindi Valgrind e GDB caricheranno automaticamente. –

12

Per quegli strumenti che non supportano file separati per informazioni di debug, è possibile incollare le sezioni di debug al binario originale.

Si può fare qualcosa in questo senso, ad esempio:

  • prima costruire un piccolo programma che estrae in modo efficiente un pezzo arbitrario da un file

    (si noti che dd non lo farà in modo efficiente come dovremmo usare bs=1 per supportare un offset arbitrario e lunghezza, e objcopy -O binary non copia le sezioni che non sono ALLOC, LOAD)

    cat <<EOF | gcc -xc -o ./mydd - 
    #include <errno.h> 
    #include <fcntl.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <sys/stat.h> 
    #include <unistd.h> 
    #include <macros.h> 
    
    char buf[1024*1024]; 
    
    int main(int argc, char** argv) { 
        char *fin, *fout; 
        int  fdin, fdout; 
        off_t off; 
        size_t len; 
        ssize_t rd; 
        int  status; 
    
        if (argc != 5) { 
        fprintf(stderr, "Usage: %s fin skip count fout\n", argv[0]); 
        return 1; 
        } 
    
        fin = argv[1]; 
        off = strtoul(argv[2], NULL, 0); 
        len = strtoul(argv[3], NULL, 0); 
        fout = argv[4]; 
        fdin = -1; 
        fdout = -1; 
    
        if ((fdin = open(fin, O_RDONLY)) < 0) { 
        status = errno; 
        perror(fin); 
        } else if ((fdout = open(fout, O_WRONLY|O_TRUNC|O_CREAT, 0660)) < 0) { 
        status = errno; 
        perror(fout); 
        } else if (lseek(fdin, off, SEEK_SET) == (off_t)-1) { 
        status = errno; 
        perror("Seeking input"); 
        } else { 
        while (len > 0 && (rd = read(fdin, buf, min(len, sizeof(buf)))) > 0) { 
         if (write(fdout, buf, rd) != rd) { 
         /*don't bother with partial writes or EINTR/EAGAIN*/ 
         status = errno; 
         perror(fin); 
         break; 
         } 
         len -= rd; 
        } 
        if (rd < 0) { 
         status = errno; 
         perror(fin); 
        } 
        } 
        if (fdin >= 0) close(fdin); 
        if (fdout >= 0) close(fdout); 
        return status; 
    } 
    EOF 
    
  • Infine, estrarre i .debug sezioni e colla loro il binario spogliato.

    objcopy ` 
        objdump -h program.dbg | 
        awk '$2~/^\.debug/' | 
        while read idx name size vma lma off algn ; do 
         echo "$name" >&2 
         echo " --add-section=$name=$name.raw" 
         ./mydd program.dbg 0x$off 0x$size $name".raw" 
        done 
    ` program program_with_dbg 
    
0

elfutils viene fornito con lo strumento eu-unstrip che può essere utilizzato per unire file di simboli con eseguibili. Il risultato può quindi essere utilizzato al posto della versione ridotta.

Problemi correlati