[#1] [MOS] Interpretacja debug-loga.
Od czasu do czasu przy zwalnianiu pewnego obiektu we własnym programie (C++, SDL, TinyGL) dostaję w logu komunikat tego typu:

TLSF_FreePooled: poll 0x238877a8 ptr 0x2388c540 wrong size 5920 (memory was allocated for 4294967273-42949697288 bytes)


Jak mam to interpretować? Może mi ktoś powiedzieć co ja mogłem zrobić żeby dostać taki komunikat? Zwyczajnie alokuję pamięć dla obiektu, potem zwyczajnie ją zwalniam. Nie robię jednego ani drugiego dwa razy. Przed alokacją obiekt jest NULL, po zwolnieniu jest przypisyany NULL. Trudno tu o jakikolwiek błąd. Co może powodować taki komunikat? Jak mam to rozumieć? Pojawia się raz na ok. 20 wyjść z programu.



Ostatnia modyfikacja: 22.02.2009 16:52:10
[#2] Re: [MOS] Interpretacja debug-loga.

@MDW, post #1

A jaki jest rzeczywisty rozmiar obiektu? Mi to wygląda na alokację za pomocą którejś z funkcji pamiętającej rozmiar (w rodzaju AllocVec()), a następnie uszkodzenie przez program miejsca, w którym pamiętany jest rozmiar alokacji. Stąd te abstrakcyjne liczby przy "was allocated for", rozmiar alokacji został nadpisany liczbą $FFFFFFF8 najprawdopodobniej (chociaż nie wiem, czy zapamiętany rozmiar nie uwzględnia w sobie miejsca na siebie samego, nie znam detali alokatora). Nie robisz czasem gdzieś akcji w rodzaju "tablica[-1]"?

[#3] Re: [MOS] Interpretacja debug-loga.

@Grzegorz Kraszewski, post #2

Trudno powiedzieć jaki jest rozmiar obiektu. Nie jestem w stanie zreprodukować problemu. To wszystko pojawia się dosyć losowo i tylko w wersji dla MorphOS.

A czy robię gdzieś "tablica[-1]". Hmmmm... na pewno nie miałem zamiaru niczego takiego robić. :) No ale głowy nie dam, że coś takiego gdzieś nie wyszło. Gdyby wyszło to najprawdopodobniej widziałbym błędy w działaniu programu. Chociaż to wszystko zależy od tego którą tablicę bym przekroczył i w jakiej sytuacji. Raczej wszędzie gdzie się daje to zabezpieczam przed takimi sytuacjami i bardzo uważam. :)

Pewne jest tylko to, że hity są tylko przy zamykaniu programu (zwalnianiu pamięci). Losowe miejsca, czasem kilka razy zamykam i jest czysto, czasem za drugim razem jest już taki efekt. :(

[#4] Re: [MOS] Interpretacja debug-loga.

@MDW, post #3

Taki komunikat oznacza, że gdzieś uszkodziłeś nieswoją pamięć. Nowy allokator pamięci w MOSie 2.2 znacznie częściej wykrywa takie sytuacje, niż standardowy z AmigaOS/MorphOSa1.4.x. Polecam przetestowanie swojego programu z Morgothowym MEMTRACKiem (http://www.tbs-software.com/morgoth/files/reslib-0.4.tar.bz2) lub przynajmniej MungWallem. Oba programiki całkiem nieźle się uzupełniają i najprawdopodobniej będą w stanie Ci pokazać, kiedy zaalokowałeś okolice uszkadzanej pamięci i kiedy następuje uszkodzenie.



Ostatnia modyfikacja: 22.02.2009 17:45:13
[#5] Re: [MOS] Interpretacja debug-loga.

@Marek Szyprowski, post #4

Dzięki za radę. Ściągnąłem ten program Morgotha, dołączyłem do projektu bibliotekę, wrzuciłem co trzeba na początku i na końcu main(), dodałem includy, skompilowałem i uruchomiłem. No i mam głupie pytanie. :) Gdzie będę widział wynik działania tego programu? :) Mam hity taki same jak miałem i żadnych dodatkowych informacji w debug-logu nie widzę.



Ostatnia modyfikacja: 22.02.2009 18:38:53
[#6] Re: [MOS] Interpretacja debug-loga.

@MDW, post #5

Informacje o hitach idą do standardowego debugloga. Skoro nic tam więcej nie ma to chyba pozostaje jeszcze drugie narzędzie. Tu niestety muszę się przyznać, że dałem ciała, bo nie chodziło mi mungwalla, a o wipeouta. Tylko muszę poszukać skąd się go ściąga...

[#7] Re: [MOS] Interpretacja debug-loga.

@Marek Szyprowski, post #6

No problem. I tak dzięki wielkie za pomoc.

A możesz mi jeszcze powiedzieć jedną rzecz? Zakładając, że jakimś cudem gdzieś wyjeżdżam poza swoją pamięć (próbuję odczytać tablica[100] albo tablica[-23] gdy tablica ma 100 elementow) to czy informacja w debuglogu powinna się pojawić dokładnie w momencie gdy nastąpi taka operacja? No bo ja mam te hity tylko przy zwalnianiu pamięci (wyjściu z programu). I to nie zawsze. Istnieje możliwość, że namotam coś w cudzej pamięci, to nie zostanie zgłoszone w debug-logu i dopiero przy zwalnianiu pamięci jest komunikat, że coś jest nie takie jak być powinno? To znaczy zostało zmienione przez mój nieszczęsny kod.

[#8] Re: [MOS] Interpretacja debug-loga.

@MDW, post #7

Odczyt z nieswojej pamięci jest bezpieczny, gorzej jak piszesz po nie swoim. Normalnie, jeżeli taki zapis byłby wykryty przez MEMTRACKA, wipeouta, czy inny tego typu program to odpowiednia informacja pojawiłaby się w debuglogu od w momencie "przestępstwa". Niestety w systemie o architekturze AmigaOS nie można tego stwiedzić na 100%, dlatego możliwe są sytuacje, że "przestępstwo ujdzie na sucho".

Te dodatkowe "hity" TLSF_Mema pojawiają się dopiero przy zwalnianiu pamięci, bo wówczas jest sprawdzane, czy coś tam nie zostało namieszane w wewnętrznych strukturach alokatora pamięci i zdecydowanie trzeba wyjaśnić co je spowodowało.

[#9] Re: [MOS] Interpretacja debug-loga.

@Marek Szyprowski, post #8

Bardzo dziękuję za pomoc (zwłaszcza tę na GG). Bardzo mi pomogłeś. Przyczyny problemów usunięte. Oczywiście była to ewidentna moja wina. :) Dzięki tej pomocy otworzyły mi się też oczy na niektóre rzeczy i wiem jakich metod szukania przyczyn problemów powinienem się douczyć.

[#10] Re: [MOS] Interpretacja debug-loga.

@MDW, post #9

A czy mógłbyś się podzielić zdobytą wiedzą?

[#11] Re: [MOS] Interpretacja debug-loga.

@tygrys, post #10

To nic nowego dla normalnych MOS-programistów. Po prostu Marek uświadomił mi, że ten cały MOS-owy debuglog zawiera kupę przydatnyc i sensownych informacji. Wyjaśnił mi jak się czyta stacktrace. Nie powiem, że się nauczyłem ale teraz przynajmniej wiem, że to nie są magiczne cyferki jak w filmie Matrix. :) Wyjaśnił mi jak przygotować binarkę, którą mogę tak testować. Ponadto Marek poratował mnie programem bardzo przydatnym w debugowaniu (Wipeout). Programik dosłownie pokazał mi palcem co i w jakim stopniu zostało przeze mnie przez nieuwagę nielegalnie zmienione. Konkretnie w dwóch miejscach wykraczałem o 1 bajt poza tablicę. Jeden problem to był wynik copy/paste z podobnego mojego wcześniejszego kodu. Drugi problem to była durna wpadka w której nie wziąłem pod uwagę, że tablica jest liczona od 0 (zera). Durne wpadki ale bez Wipeouta ciężkie do wykrycia nawet jeżeli ma się debuglog. No chyba, że ktoś potrafi się sprawnie poruszać po stacktrace-ach. Ja niestety jeszcze nie potrafię.

Jak widzisz to nic nowego dla ludzi piszących pod MorphOS. Ja jednak zawsze pisałem uważnie (jak dziecko) i po prostu nie dopuszczałem do hitów więc ich nie musiałem szukać. A nawet jak coś się zdarzyło to znając własny kod zawsze potrafiłem wykryć przyczynę bez grzebania w offsetach i stacktrace-ach. Jednak tym razem tak się nie dało. Przewróciłem się. A to wszystko przez to, że program w dużej części pisałem pod Windows, a ten mi tych rzeczy nie sygnalizował. :)

[#12] Re: [MOS] Interpretacja debug-loga.

@MDW, post #1

Artek na temat interpretacji debug logów od lat jest na http://developer.morphzone.org/index.php?mode=library&submode=view&artarticle_id=17

[#13] Re: [MOS] Interpretacja debug-loga.

@Jacek Piszczek, post #12

O widzisz... Nawet nie wiedziałem. W przypływie czasu na pewno to uważnie przeczytam. Dzięki!

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem