FC4B Napisano Październik 21, 2008 Zgłoszenie Share Napisano Październik 21, 2008 Pisze sobie program który pobiera dane z pliku potem coś tam oblicza, do pewnego momentu bylo wszystko ok, nagle zaczęły mi się dziać dziwne rzeczy z funkcją którą mialem chyba od początku: int *pt; pt = new int[(*liczba)+1]; Niby standardowa instrukcja przez nią mam coś takiego: *** glibc detected *** ./geo1: malloc(): memory corruption: 0x00000000016e0220 *** ======= Backtrace: ========= /lib64/libc.so.6[0x31fb27b5df] /lib64/libc.so.6(__libc_malloc+0x98)[0x31fb27ce18] /usr/lib64/libstdc++.so.6(_Znwm+0x1d)[0x32026c41bd] /usr/lib64/libstdc++.so.6(_Znam+0x9)[0x32026c42f9] ./geo1(__gxx_personality_v0+0x48c)[0x401984] ./geo1[0x4021e1] ./geo1[0x40386d] /lib64/libc.so.6(__libc_start_main+0xfa)[0x31fb21e32a] ./geo1(__gxx_personality_v0+0xa1)[0x401599] ======= Memory map: ======== 00400000-00405000 r-xp 00000000 08:06 1933315 /home/ja/program/geo1 00604000-00605000 rw-p 00004000 08:06 1933315 /home/ja/program/geo1 016dd000-016fe000 rw-p 016dd000 00:00 0 [heap] 31fae00000-31fae1d000 r-xp 00000000 08:09 966682 /lib64/ld-2.8.so 31fb01c000-31fb01d000 r--p 0001c000 08:09 966682 /lib64/ld-2.8.so 31fb01d000-31fb01e000 rw-p 0001d000 08:09 966682 /lib64/ld-2.8.so 31fb200000-31fb362000 r-xp 00000000 08:09 966684 /lib64/libc-2.8.so 31fb362000-31fb562000 ---p 00162000 08:09 966684 /lib64/libc-2.8.so 31fb562000-31fb566000 r--p 00162000 08:09 966684 /lib64/libc-2.8.so 31fb566000-31fb567000 rw-p 00166000 08:09 966684 /lib64/libc-2.8.so 31fb567000-31fb56c000 rw-p 31fb567000 00:00 0 31fb600000-31fb684000 r-xp 00000000 08:09 966974 /lib64/libm-2.8.so 31fb684000-31fb883000 ---p 00084000 08:09 966974 /lib64/libm-2.8.so 31fb883000-31fb884000 r--p 00083000 08:09 966974 /lib64/libm-2.8.so 31fb884000-31fb885000 rw-p 00084000 08:09 966974 /lib64/libm-2.8.so 3200a00000-3200a16000 r-xp 00000000 08:09 967505 /lib64/libgcc_s-4.3.0-20080428.so.1 3200a16000-3200c15000 ---p 00016000 08:09 967505 /lib64/libgcc_s-4.3.0-20080428.so.1 3200c15000-3200c16000 rw-p 00015000 08:09 967505 /lib64/libgcc_s-4.3.0-20080428.so.1 3202600000-32026ee000 r-xp 00000000 08:09 378831 /usr/lib64/libstdc++.so.6.0.10 32026ee000-32028ee000 ---p 000ee000 08:09 378831 /usr/lib64/libstdc++.so.6.0.10 32028ee000-32028f5000 r--p 000ee000 08:09 378831 /usr/lib64/libstdc++.so.6.0.10 32028f5000-32028f7000 rw-p 000f5000 08:09 378831 /usr/lib64/libstdc++.so.6.0.10 32028f7000-320290a000 rw-p 32028f7000 00:00 0 7f2f1c000000-7f2f1c021000 rw-p 7f2f1c000000 00:00 0 7f2f1c021000-7f2f20000000 ---p 7f2f1c021000 00:00 0 7f2f20ad7000-7f2f20ada000 rw-p 7f2f20ad7000 00:00 0 7f2f20b03000-7f2f20b07000 rw-p 7f2f20b03000 00:00 0 7fff28ad0000-7fff28b06000 rw-p 7ffffffc9000 00:00 0 [stack] 7fff28bfe000-7fff28bff000 r-xp 7fff28bfe000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] Do pewnego czasu działało mi bez zastrzeżeń, ale potem coraz częsciej i coraz więcej przykładów zaczynało wywalac mi ten błąd. Mam pytanie czy to wygląda na mój błąd w programie czy mogloto być spowodowane np updatem i problemem z kompilatorem? pozdrawiam EDIT: oczywiście ten problem pojawia się po uruchomieniu skompilowanego programu, sama kompilacja zachodzi bez zastrzeżen Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
ecik__ Napisano Październik 21, 2008 Zgłoszenie Share Napisano Październik 21, 2008 Chyba powinieneś dać jakiś większy fragment kodu, bo to co podałeś raczej powinno zawsze działać. Problem może leżeć gdzie indziej. Możesz też spróbować napisać jakiś krótki (ale kompletny) kod, który wywołuje powyższe problemy i go wkleić. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Lukasz69 Napisano Październik 21, 2008 Zgłoszenie Share Napisano Październik 21, 2008 Wstaw jakiś kod - może to od reszty kontekstu zależy. Może błąd jest przy dealokacji pamięci albo *liczba może coś psuć. Po takim fragmencie nic nie wiadomo. Może próbujesz czytać i modyfikować miejsce w pamięci które jest chronione? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
FC4B Napisano Październik 22, 2008 Autor Zgłoszenie Share Napisano Październik 22, 2008 Program jest dosyć rozbudowany i ciężko mi cały wkleić, poza tym przy danych rzedu 22 zawsze zatrzymuje się na tym fragmencie, przy większych jak np 535 zachodzi dalej ale wywala mi błąd już na samym koncu po tym gdy podaje gotowy wynik (Troszkę źle opisłem w pierwszym poście bo nie sprawdziłem z innymi danymi). Chwilowo nie mam dostępu do drugiego komputera, będę musiał przetestować to jeszcze na 32bitowej maszynie. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
mikolajs Napisano Październik 22, 2008 Zgłoszenie Share Napisano Październik 22, 2008 Ważne jaka liczba kryje się pod wskaźnikiem liczba, możesz przekroczyć dostępną do alokacji pamięć (choć powinien wtedy rzucić wyjątek bad_alloc ) Sprawdź sobie wartość *liczba przed instrukcją tworzenia tablicy. (Rozumiem, że pewność co do przyczyny daje Ci gdb). Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
FC4B Napisano Październik 22, 2008 Autor Zgłoszenie Share Napisano Październik 22, 2008 Całą noc przeglądałem kod i znalazłem błąd w funkcji którą użyłem prawie na samym początku (dodałem do niej 1) co ciekawe w ogole nie odnosi się do tego miejsca przerwania ale do "memcpy", zazwyczaj w takich przypadkach widziałem "naruszenie ochrony pamięci" dzięki chłopaki za fatygę, pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się