2012-04-11 8 views
0

Ich hatte Probleme mit dem gleichen Programm, weil es viele Speicherzuweisungen macht. Ich bin die meisten Probleme losgeworden, aber ich habe immer noch Probleme mit einem bestimmten Problem. Wenn ich mein Programm in Eclipse lief es kompiliert gut, aber es stürzt mit dieser NachrichtSpeicherprobleme, die mein c-Programm zum Absturz bringen, aber es stürzt beim Debuggen nicht ab?

*** glibc detected *** /home/user/workspace/TTPrueba/Debug/TTPrueba: free(): invalid pointer: 0xb6bc0588 *** 

Als ich es lief mit Valgrind es mir diese

==31580== Process terminating with default action of signal 11 (SIGSEGV) 
==31580== Access not within mapped region at address 0x0 
==31580== at 0x804BEA3: termino (Menu.c:899) 
==31580== by 0x804BE05: computar_transformadas (Menu.c:840) 

So das Problem sagt, ist, dass es kostenlos versucht eine ungültige Speicheradresse, aber dann gehe ich im Debug-Modus Schritt für Schritt und das Programm stürzt nie !!!! :(

Jede Idee, warum so etwas passieren könnte? Wie kommt es funktioniert beim Debuggen, aber nicht beim Laufen? Das ist ziemlich seltsames Verhalten.

for(phi=0;phi<360;phi++){ 

     for(j=0;j<par.param1[phi][0];j++){ 


       for(o=0;o<(par.prueba[phi][j][1]-par.prueba[phi][j][0]);o++){//AQUI 849 

       free(par.pixels[phi][j][o]);//HERE IS LINE 899 WHERE IT ALWAYS CRASHES 

       if(o==(par.prueba[phi][j][1]-par.prueba[phi][j][0]-1)) 
        free(par.pixels[phi][j]); 

       } 


      free(par.prueba[phi][j]); 

     } 

Danke für die Hilfe!

+5

Ah. Die schöne - und nicht * fast * seltene genug - [Heisenbug] (http://en.wikipedia.org/wiki/Heisenbug) in seinem natürlichen Lebensraum. Sehen Sie das schöne Tarnmuster des Gefieders? Was ist das? Du kannst es nicht sehen? Nun ja. So weißt du, dass es da ist. – dmckee

+2

Im Debugger der Speicher möglicherweise Null, in Ihrem Programm ist dies möglicherweise nicht der Fall. Versuchen Sie, Ihre Mallocs in Callocs zu ändern. – Mikhail

+2

"Ich gehe Schritt für Schritt im Debug-Modus und das Programm stürzt nie !!!!" - Willkommen in der Welt des Debuggens! –

Antwort

0

Eine wahrscheinliche Grund - der Debugger könnte das Speicherlayout der Dinge ändern, also wenn der Speicher beschädigt ist, befindet er sich zufällig an einem Ort "0" möglicherweise nicht in einer Produktion r passiert un.

+1

oder die implizite Synchronisation der Verwendung des Debuggers an Haltepunkten zu stoppen ändert die Timing-Interaktion von Threads ... (wenn Multithread) –

+0

Nicht Multithread, so dass das nicht das Problem ist. Ich denke, einige unitäre Werte sind das Problem. – Atirag

0

Es ist nicht überraschend. Zum Beispiel, wenn par.pixels [phi] [j] [o] nicht initialisiert ist. Es kann alles enthalten, in einer Debugger-Umgebung haben Sie unterschiedliche Speicherlayout par.pixels [phi] [j] [o] kann 0 werden, so frei stürzte nicht ab.

+0

Ich habe versucht, dies mit Callocs anstelle von Mallocs zu beheben, aber ohne Erfolg ... – Atirag

+0

Neben der Verwendung von Calloc (Stellen Sie sicher, dass die Zeiger auf NULL gesetzt sind, versuchen, sie irrtümlich dereferenzieren), ist es eine gute Praxis, Zeiger zu setzen NULL nach dem Freigeben des Speichers, auf den sie zeigen (aus dem gleichen Grund). Oder manchmal beim Debuggen ein "Gift" -Wert (zB 0xdeadbeefdeadbeef), der sich in Fehlermeldungen/Debug-Prints abzeichnet. –

+0

Wie kann ich das tun? zum Beispiel, wenn ich frei mache (par.pixels [j] [o]); soll ich danach etwas machen? – Atirag

0

Ein Problem, das ich sehe, ist, dass Sie frei par.pixels[phi][j][o] wo o von Null Looping und dann Zugangpar.pixels[phi][j][0], die nur free'd haben!

Sie auch frei par.pixels[phi][j] aber weiterhin Schleifen Zugriff auf par.pixels[phi][j] und die Freigabe von Zeigern, die nicht mehr gültig.

+0

Ich greife niemals auf par.pixels [phi] [j] [0] nach dem Freigeben von par.pixels [phi] [j] [o] Ich greife auf par.prueba [phi] [j] [0] zu. – Atirag

+0

Auch wenn ich par.pixels [phi] [j] freistelle, stelle ich sicher, dass es die letzte Schleife ist, also wird die nächste Schleife daraus kommen und aufhören, Speicher freizugeben – Atirag

Verwandte Themen