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.2das 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]