2013-04-12 6 views

Antwort

4

Valgrind unterstützt separate debug files, so sollten Sie die answer here verwenden, und Valgrind sollte ordnungsgemäß mit der externen Debug-Datei funktionieren.

+0

Und nein: Sie können nicht eine untripped Binärdatei aus einer striped (zumindest nicht leicht) erstellen. Aber Sie sollten nicht müssen, wie diese Antwort richtig angibt. –

+0

Es tut mir leid, aber es ist unklar, wie kann ich diese Debug-Datei w/valgrind verwenden. Würde mich über Hinweise freuen. – cached

+0

Die Anweisungen in der "Antwort hier" scheinen ziemlich klar zu sein. Sie erstellen die separate debuginfo, und dann laden Valgrind und GDB sie automatisch. –

12

Für diese Tools, die separate Dateien für Debuginformationen nicht unterstützen, können Sie die Debug-Abschnitte auf die ursprüngliche binäre kleben.

Sie können zum Beispiel etwas in diese Richtung tun:

  • Zuerst ein kleines Programm bauen, die effizient extrahiert einen beliebigen Brocken aus einer Datei

    (beachten Sie, dass dd dies nicht effizient da wir bs=1 verwenden müssen, um einen willkürlichen Offset zu unterstützen und Länge, und objcopy -O binary kopiert nicht Abschnitte, die nicht sind 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 
    
  • Schließlich extrahieren Sie die .debug Abschnitte und an den gestrippt binären kleben.

    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 kommt mit dem Werkzeug eu-unstrip, die verwendet werden können, um Symboldateien mit ausführbaren Dateien zusammenführen. Das Ergebnis kann dann anstelle der entfernten Version verwendet werden.

Verwandte Themen