neuerer gcc macht mir ein segfault



  • also ich hab ein kleines prog geschrieben. das war nicht an meinem rechener. da hat alles wunderbarfunktioniert mit dem kompilieren und dem ausführen.
    jetzt hab ich den code mir an meinem heimischen computer geholt natürlich kompiliert und getestet. jetzt bekomme ich aber am ende des progs einen segfault. durch debuggen bekomme ich leider auch nichts raus.
    auf dem anderen rechner war gcc 3.3.1 oder so
    hier auf meinem rechener habe ich gcc 4.1.2

    das is die ausgabe von gdb:

    Breakpoint 1, main () at main.c:24
    24              return 0;
    (gdb) n
    25      }
    (gdb) n
    0x00000000 in ?? ()
    (gdb) n
    Cannot find bounds of current function
    (gdb) c
    Continuing.
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000 in ?? ()
    (gdb) c
    Continuing.
    
    Program terminated with signal SIGSEGV, Segmentation fault.
    The program no longer exists.
    

    eigentlich sollte das prog schon beendet sein in diesem moment.

    kompiliert habe ich einfach mit: gcc foo.c bar.c -o test

    also mit dem alten compiler hat alles wunderbar funktioniert. nur mit dem neuen gibts probleme.
    wenn mir einer sagen kann wie das sein kann, bitte mal melden.



  • kompilier doch mal Debug-Symbole dazu 🙄 (Option -g -ggdb -O0)

    und mach mal einen backtrace nach dem Segfault



  • als backtrace ergibt sich(ganz ausführlich):

    Breakpoint 1, main () at main.c:24
    24              return 0;
    (gdb) bt
    #0  main () at main.c:24
    (gdb) n
    25      }
    (gdb) bt
    #0  main () at main.c:25
    (gdb) n
    0x00000000 in ?? ()
    (gdb) bt
    #0  0x00000000 in ?? ()
    #1  0x00000000 in ?? ()
    (gdb) n
    Cannot find bounds of current function
    (gdb) bt
    #0  0x00000000 in ?? ()
    #1  0x00000000 in ?? ()
    (gdb) c
    Continuing.
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000 in ?? ()
    (gdb) bt
    #0  0x00000000 in ?? ()
    #1  0x00000000 in ?? ()
    

    ich weiß auch nicht, was der da am ende des programs noch machen will:

    int main()
    {
      //Variablen
    
      //irgendwelche Anweisungen
    
      return 0; // <- hier sagt er mir noch nichts
    } // <- wenn ich hier 'n' in dbg eingebe kommt die im ersten beitrag gezeigte anzeige in zeile 6
    

    eigentlich sollte das prog doch hier schon praktisch durch sein.
    was macht das prog da am ende noch?



  • wen es interessiert, hier is der asm-output (-S):

    .file   "main.c"
            .text
    .globl main
            .type   main, @function
    main:
            leal    4(%esp), %ecx
            andl    $-16, %esp
            pushl   -4(%ecx)
            pushl   %ebp
            movl    %esp, %ebp
            pushl   %edi
            pushl   %ecx
            subl    $80, %esp
            movl    $46, 12(%esp)
            movl    $10, 8(%esp)
            movl    $10, 4(%esp)
            movl    -16(%ebp), %eax
            movl    %eax, (%esp)
            call    field_initW
            leal    -64(%ebp), %edi
            cld
            movl    $0, %edx
            movl    $12, %eax
            movl    %eax, %ecx
            movl    %edx, %eax
            rep
            stosl
            movl    $1, -64(%ebp)
            movl    $1, -60(%ebp)
            leal    -64(%ebp), %eax
            movl    %eax, -12(%ebp)
            movl    $2, 4(%esp)
            movl    -12(%ebp), %eax
            movl    %eax, (%esp)
            call    bSetBlockType
            movl    $35, 4(%esp)
            movl    -12(%ebp), %eax
            movl    %eax, (%esp)
            call    bSetChar
            movl    -12(%ebp), %eax
            movl    %eax, (%esp)
            call    brotate
            movl    -12(%ebp), %eax
            movl    %eax, 4(%esp)
            movl    -16(%ebp), %eax
            movl    %eax, (%esp)
            call    fb_insert
            movl    -16(%ebp), %eax
            movl    %eax, (%esp)
            call    f_print
            movl    -16(%ebp), %eax
            movl    %eax, (%esp)
            call    f_shutdown
            movl    $0, %eax
            addl    $80, %esp
            popl    %ecx
            popl    %edi
            popl    %ebp
            leal    -4(%ecx), %esp
            ret
            .size   main, .-main
            .ident  "GCC: (GNU) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)"
            .section        .note.GNU-stack,"",@progbits
    

    [Edit]
    also ich hab herausgefunden woran es liegt:
    er macht zwar am anfang "pushl -4(%ecx)" aber am ende nicht "popl -4(%ecx)"
    [\Edit]


Anmelden zum Antworten