Autor Wątek: Jak wykryć niedozwolone operacje w programie (C++) pod Windows?  (Przeczytany 2875 razy)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 21, 2009, 08:58:32
Jestem w trakcie pisania czegoś na kilka platform. Dzięki #define, przenośnemu SDL, OpenGL i C++ zmieniając jeden wiersz w swoim programie mogę skompilować i uruchomić go zarówno pod Windows jak i (pewnie dosyć dziwnym dla niektórych) MorphOS-em. Niestety w programowaniu pod Windows jestem zielony i stąd zapewne powstał problem na który trafiłem. Ale najpierw kilka słów wstępu.

MorphOS to ciągle rozwijanym, komercyjnym (kilka miesięcy temu kupiłem wersję 2.0, a miesiąc temu wyszła aktualizacja 2.2) klonem AmigaOS w pełni skompilowanym dla procesorów PowerPC. Działa na maszynach PegasosI i II (G3/600, G4/1000) i Efika. Wkrótce pojawi się wersja dla MiniMaca z PowerPC. Stare wersje działały na Amidze Classic z PowerPC ale były bardzo zubożałe i ta platforma nie jest już wspierana przez obecne wersje. MorphOS jest niemal w 100% kompatybilny wstecz z AmigaOS do wersji 3.9 włącznie. Przez ostatnie lata system rozwinął się bardzo ale chcąc zachować kompatybilność z klasyczną linią AmigaOS musi ciągle mieć jego podstawową wadę, czyli brak ochrony pamięci. To znaczy w tej chwili ma ale taką bardzo szczątkową (chyba nie można wjechać na obszar pamięci zajmowany przez kernel). No i wszelkie niedozwolone operacje mogą (chociaż nie muszą - to jest loteria) skończyć się zwisem programu tego albo nawet innego. Zdarza się wywrotka całego systemu. To jest cena kompatybilności z AmigaOS 3.x. Jak program jest poprawnie napisany to takie rzeczy nie mają prawa się zdarzyć.

Jak co 1-3 dni przenoszę swój program na Pegasosa (PPC/G4) i sprawdzam czy działa na nim to co wypociłem. Jak zwykle działało ale przy wyjściu miałem zwis. MorphOS ma taką sympatyczną cechę, że wszystkie operacje w systemie są dosyć szczegółowo logowane (jeżeli się to włączy). Logi lecą do pliku, pamięci albo przez serial na drugi komputer. Rzuciłem okiem na logi i widzę, że jest tam kupa niedozwolonych operacji. Po 2 godzinach sprawdzania i testowania doszedłem do powodów tego zwisu. Przez swoją sklerozę w dwóch miejscach próbowałem zwalniać już zwolnioną pamięć. Ok, zdarza się - w końcu to nawet nie jest wersja alpha programu. :) No i tutaj pytanie.

Jak tego typu operacje (próba wyjechania poza zaalokowany obszar pamięci, próbwa zwolnienia zwolnionej pamięci) wykryć pod Windows? Używam Code::Block. Przecież gdyby nie to, że robię wersję dla MorphOS-a to nigdy w życiu bym tego nie odkrył i gdyby nie jego systemowe logi to nigdy w życiu bym tego nie naprawił. Program bezbłędnie (na pierwszy rzut oka) chodził i się zamykał pod Windows. Prawdę mówiąc jeżeli tak ma wyglądać ochrona pamięci to ja chcę mieć możliwość jej wyłączenia, bo dzięki temu przynajmniej wyłapuję takie "kwiatki" i soft jest poprawnie napisany. :) No ale pewnie są jakieś metody na wykrywanie niedozwolonych operacji pod Windows. Może mnie ktoś uświadomić jak to zrobić?

Mam nadzieję, że przydługawy opis nie zniechęcił Was do pytania i ktoś jednak coś mi odpowie. :)
« Ostatnia zmiana: Styczeń 21, 2009, 09:04:56 wysłana przez MDW »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Styczeń 21, 2009, 09:39:32
Jeśli zwis był przy wyjściu to prawdopodobnie znaczy, że czegoś nie zwalniasz. Windows sobie z tym radzi, wywalając po prostu całą przydzieloną dla procesu pamięć w niebyt przy jego zakończeniu. Stąd ten błąd i z tego powodu MorphOS wywala program przy zamykaniu. Poszukaj elementów, których nie zwalniasz (na pewno są jakieś debuggery ze śledzeniem alokacji na windows; ja znam tylko plugin do Visual Studio - działa tak sobie).

P.S. podziwiam, że masz nerwy i czas pisać na tak egzotyczną platformę :)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 21, 2009, 10:08:30
Jeśli zwis był przy wyjściu to prawdopodobnie znaczy, że czegoś nie zwalniasz. Windows sobie z tym radzi, wywalając po prostu całą przydzieloną dla procesu pamięć w niebyt przy jego zakończeniu. Stąd ten błąd i z tego powodu MorphOS wywala program przy zamykaniu. Poszukaj elementów, których nie zwalniasz (na pewno są jakieś debuggery ze śledzeniem alokacji na windows; ja znam tylko plugin do Visual Studio - działa tak sobie).

Ja już nie mam problemu. Pytam tylko na przyszłość. :) Przy pomocy kprintf i logów MorphOS-a wyśledziłem co było przyczyną. Teraz logi są czyste od błędów i zwis nie następuje. Przyczyną była (wielokrotna) próba zwolnienia pamięci już zwolnionej. Myślę, że gdybym zostawił coś niezwolnionego to po prostu miałbym wyciek pamięci a program by się nie powiesił. Jako ciekawostkę mogę podać, że po takim zwisie nagle moja maszyna pokazywała, że ma wolne ponad 700 MB RAM chociaż w Pegasosie mam fizycznie 256 MB (chwilowo, bo normalnie mam 512MB). Pamięci wirtualnej MorphOS się jeszcze nie dorobił. :)


P.S. podziwiam, że masz nerwy i czas pisać na tak egzotyczną platformę :)

Nie ma co podziwiać. :) To dla mnie czysta przyjemność. Nawet jeżeli kiedyś tego mojego śmiesznego casuala wypuszczę komercyjnie dla Windows to zrobię wszystko żeby zachować prawa do wypuszczenia wersji dla MorphOS, AmigaOS3, AmigaOS4, AROS zupełnie za darmo. To prawdziwa przyjemność. Jeżeli kiedyś będę strasznie bogaty (hehehe) to na pewno będę pisał za darmo gry dla tych systemów (może za wyjątkiem AmigaOS3, bo maszyny są zbyt słabe i system się nie rozwija). To po prostu hobby takie jak jeżdżenie VW Garbusem, Harleyem, łowienie ryb. To nie ma znaczenia, że są lepsze samochody, że kupowanie ryb jest tańsze niż łowienie. Po prostu to jest hobby. W moim przypadku wieloletnie (od 1994 roku).

Offline misioslaw

  • Użytkownik
    • www.asmforce.eu

# Styczeń 21, 2009, 10:22:17
Taka drobna różnica między Amiśką a Windowsem. Na Ami jak zaalokowałeś pamięć a jej nie zwolniłeś to przepadała bezpowrotnie. Pod oknami system dostanie ją z powrotem po zakończeniu działania programu.
Także możesz czuć się jak typowy programista Win32 i olać zwalnianie pamięci, najwyżej napiszesz że gra wymaga nie 256MB a 1GB RAMu :)
« Ostatnia zmiana: Styczeń 21, 2009, 10:24:53 wysłana przez misioslaw »

Offline vashpan

  • Użytkownik
    • Strona

# Styczeń 21, 2009, 10:31:02
Nie mozna wylaczyc ochrony pamieci, nie dosc ze lezy bardzo gleboko w jadrze, to nie jest w gruncie rzeczy mechanizm programowy, w duzej mierze jest zalezny od CPU...

W Windowsie podwojne zwalnianie pamieci AFAIK tez jest bledem i tez moze doprowadzic do wysypania sie programu... Ale nie zawsze :) Tak samo czytanie gdzies poza granicami tablicy moze wywalic program ale tez nie  w 100% przypadkow. Twoj blad byc moze kiedys pokazalby sie w Windows i wtedy naprawde mialbys duzy problem ;p
« Ostatnia zmiana: Styczeń 21, 2009, 10:32:56 wysłana przez vashpan »

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 21, 2009, 10:49:48
Nie mozna wylaczyc ochrony pamieci, nie dosc ze lezy bardzo gleboko w jadrze, to nie jest w gruncie rzeczy mechanizm programowy, w duzej mierze jest zalezny od CPU...

Tak tak. Ja to napisałem z przymrużeniem oka. :)


W Windowsie podwojne zwalnianie pamieci AFAIK tez jest bledem i tez moze doprowadzic do wysypania sie programu... Ale nie zawsze :) Tak samo czytanie gdzies poza granicami tablicy moze wywalic program ale tez nie  w 100% przypadkow. Twoj blad byc moze kiedys pokazalby sie w Windows i wtedy naprawde mialbys duzy problem ;p

Zgadzam się. I właśnie chciałbym potrafić wykrywać tego typu błędy także pod Windows. Nie będę przecież robił wersji dla MorphOS żeby sprawdzić program pod kątem tego typu błędów. :) Na pewno istnieje możliwość ich wykrycia pod Windows. W końcu stopień zaawansowania narzędzi dla Windows jest tak na oko sądząc 100 razy większy niż narzędzi dla MorphOS.

Offline yarpen

  • Użytkownik

# Styczeń 21, 2009, 11:08:23
Nie znam Code:Blocks. Pod MSVC masz debug CRT i testowanie sterty + SEH.

Offline szalony_zlomiarz

  • Użytkownik

# Styczeń 21, 2009, 11:41:58
Cóż, jeśli chodzi o dostęp do pamięci to WinXP często nie zgłasza problemów (np. pamięć 2 razy zwolniona), za to pod vistą/7/linuxem takie błędy są (a przynajmniej z moich obserwacji tak wynika) zawsze zgłaszane.

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 21, 2009, 11:57:46
Cóż, jeśli chodzi o dostęp do pamięci to WinXP często nie zgłasza problemów (np. pamięć 2 razy zwolniona), za to pod vistą/7/linuxem takie błędy są (a przynajmniej z moich obserwacji tak wynika) zawsze zgłaszane.

No to ciekawe. W logach MorphOS-a jest każda tego typu sprawa odnotowana na czerwono. Nic się nie przeciśnie. :) Czasem się człowiek łapie za głowę jak syfią niektóre stare programy pod stary AmigaOS. I potem krąży taki mit o niestabilności AmigaOS... :)

Offline misioslaw

  • Użytkownik
    • www.asmforce.eu

# Styczeń 21, 2009, 12:59:56
I potem krąży taki mit o niestabilności AmigaOS... :)
Stabilny był, jeśli równolegle działał tylko jeden program.
Nie od dziś wiadomo że pamięć Amigi programy traktowały jak swoje własne podwórko (pisanie po pamięci gdzie popadnie, ładowanie pod określony z góry adres, itd). Aż po pewnym czasie używania systemu trudno było znaleść kilkukilobajtowy ciągły blok wolnej pamięci :D
Ale to wszystko było bardzo wygodne z punktu widzenia programisty.. wystarczyło załadować wszystko do pamięci i program był gotów do działania :)
« Ostatnia zmiana: Styczeń 21, 2009, 13:02:51 wysłana przez misioslaw »

Offline mINA87

  • Użytkownik

# Styczeń 21, 2009, 13:03:20
Możesz spróbować napisać własny memory manager, w którym logowałbyś operacje na pamięci i dzięki temu byłbyś w stanie od razu wykryć nieprawidłowść. Jakaś mapa + przeciążenie new/delete czy tam jakieś define'y powinny rozwiązać problem, wszystko zależy od tego w jaki sposób podchodzisz do pamięci (malloc/free czy new/delete) oraz czy masz jakieś przeciążane operatory new/delete czy jakieś tam alokatory.
//edit:
Podziwiam Cię :) Kiedyś byłem zatwardziałym Amigowcem, ale moja przygoda z Amisią skończyła się na klasycznej 1200 z MC68030 z FPU, 32MB RAMu, HDD, CD, Modem. Chciałbym kiedys powrócić do tego Amigowego światka :]

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 21, 2009, 14:07:06
Możesz spróbować napisać własny memory manager, w którym logowałbyś operacje na pamięci i dzięki temu byłbyś w stanie od razu wykryć nieprawidłowść. Jakaś mapa + przeciążenie new/delete czy tam jakieś define'y powinny rozwiązać problem, wszystko zależy od tego w jaki sposób podchodzisz do pamięci (malloc/free czy new/delete) oraz czy masz jakieś przeciążane operatory new/delete czy jakieś tam alokatory.

Ojej. Trochę za późno na przeróbki. Może w następnym życiu. :)


Podziwiam Cię :) Kiedyś byłem zatwardziałym Amigowcem, ale moja przygoda z Amisią skończyła się na klasycznej 1200 z MC68030 z FPU, 32MB RAMu, HDD, CD, Modem. Chciałbym kiedys powrócić do tego Amigowego światka :]

Zapraszamy. Środowisko jest wygłodniałe developerów wszelkiej maści. Nowe wersje systemów operacyjnych, nowe maszyny, nowe standardy, nowe możliwości i stary klimat. To wszystko czeka na kreatywnych ludzi, bo niestety przez lata 95% uciekło. Z programistami i tak jest najlepiej. Najgorzej sprawa wygląda z muzykam i grafikami, których przecież kiedyś w ami-świecie było najwięcej. Niestety braki sprzętowe i programowe przyczyniły się do odejścia wielu z nich. Na szczęście "innoplatformowi" graficy i muzycy się czasem udzielają i czasem wspierają tę mikroskopijną i w dodatku mocno podzieloną społeczność. Szkoda, że to co jest teraz nie wyszło 10 lat temu. Wtedy wielu późniejszych uciekinierów by na pewno zostało...

Aod

  • Gość
# Styczeń 21, 2009, 14:12:07
Hmmm, ja też chcę wrócić do korzeni.
Jaką nową Amigę byś polecił (cena nie gra roli) i gdzie ją można kupić? :)

Offline mINA87

  • Użytkownik

# Styczeń 21, 2009, 14:15:54
Ojej. Trochę za późno na przeróbki. Może w następnym życiu. :)
Pewne przeróbki byłyby niezbędne, ale czy ja wiem czy za późno? Ostatnio integrowałem takie cudo z cholernie dużym systemem i dużo czasu nie zabrało - poincludowanie hurtem nagłówka memmanagera, build, poprawki i voila :]

Zapraszamy. Środowisko jest wygłodniałe developerów wszelkiej maści. Nowe wersje systemów operacyjnych, nowe maszyny, nowe standardy, nowe możliwości i stary klimat. To wszystko czeka na kreatywnych ludzi, bo niestety przez lata 95% uciekło. Z programistami i tak jest najlepiej. Najgorzej sprawa wygląda z muzykam i grafikami, których przecież kiedyś w ami-świecie było najwięcej. Niestety braki sprzętowe i programowe przyczyniły się do odejścia wielu z nich. Na szczęście "innoplatformowi" graficy i muzycy się czasem udzielają i czasem wspierają tę mikroskopijną i w dodatku mocno podzieloną społeczność. Szkoda, że to co jest teraz nie wyszło 10 lat temu. Wtedy wielu późniejszych uciekinierów by na pewno zostało...
Z chęcią bym coś porobił, ale potrzebowałbym sprzętu i czasu. Czas bym jeszcze znalazł, ale ze sprzętem sam nie wiem w co się pakować - w klasyka za bardzo nie ma sensu, PegasOS za drogi trochę dla mnie.
//edit:
W sumie to najchętniej bym połaczył zabawę w Amigę w zabawę z hardwarem i zajął się odpaleniem jakiegoś projektu typu Minimiga ;)
« Ostatnia zmiana: Styczeń 21, 2009, 14:17:55 wysłana przez mINA87 »

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 21, 2009, 14:52:53
Hmmm, ja też chcę wrócić do korzeni.
Jaką nową Amigę byś polecił (cena nie gra roli) i gdzie ją można kupić? :)

Generalnie jeżeli ktoś nie chce się bawić w stare i nierozwijane rzeczy to powinien pominąć wszelkiego typu Amigi Classic i AmigaOS 3.x. AROS (czyli klon AmigaOS dla PC/Intel) jest od lat w zbyt wczesnym stadium żeby się w to bawić. Poza tym ostatnio rozpadł się na dwa odłamy co już zupełnie jest bez sensu. Na polu boju są dwa silne obozy: oficjalna kontynuacja AmigaOS, czyli wersja 4.x i klon AmigaOS, czyli MorphOS. Przedstawicieli AmigaOS4 w Polsce jest niewielu. 90% ludzi, którzy chcieli czegoś nowego nie wytrzymała i kupiła maszyny do MorphOS, bo AmigaOS4 opóźniał się całymi latami.

Nowe maszyny dla MorphOS-a to: Pegasos I (G3 600MHz) i późniejszy (znacznie bardziej udany) Pegasos II (G3 600MHz i G4 1000MHz). Jakiś czas temu wyszła bardzo tania Efika. Ale to sprzęt duuużo słabszy i co najgorsze - nie można w nim dokładać pamięci. A tej ma tylko 128MB co jak na dzisiejsze wersje ami-systemów i ami-programów jest trochę za mało. Chociaż używać się da i kupa Polaków ma ten sprzęt. Pegasosa można kupić z drugiej ręki albo od eFunzine (jedna z dwóch ostatnich polskich amigowych firm). Efika to sprzęt przemysłowy, a nie domowy. Miniaturowa maszyna (jej procesor wcina 5W energii przy max. obciążeniu), którą trzeba sobie trochę samemu złożyć, bo zestawy nie są sprzedawane. MorphOS działa na tym fajnie ale po PC nie radzę się na to przesiadać. :) Do maszyny dokładany jest MorphOS 1.4.x ale ja polecam MorphOS 2.2. No ale 2.x już trzeba sobie kupić. W promocji był za 111 euro. Trochę sztuk w Polsce się sprzedało (sam ze swojego PayPala kupowałem 6 sztuk dla 5 znajomych). W przypadku Efiki albo następnej maszyny (o której za chwilę) warto mieć wersję 2.x, bo dopiero ona ma dźwięk. Wersje 1.x dźwięk miały tylko na Pegasosach i AmidzePPC. W najbliższym czasie ma pojawić się MorphOS w wersji dla MiniMac z procesorem PowerPC. Odkąd Apple przeszło na Intela to Maci z PPC na eBay są niemal za darmo. W sytuacji gdy nie ma nowego dużego sprzętu to będzie niezła deska ratunkowa dla naszego środowiska. Oby tylko nie pogrzebała ewentualnych producentów tymi tanimi Macami.

Po drugiej stronie barykady jest AmigaOS 4.2 działający na AmigaONE i microA1 (G3 i G4), AmidzeClassicPPC (pomijam, bo miałem pisać o nowych maszynach). Niestety obie nie są od dawna produkowane. W tej chwili jest tylko maszyna o nazwie SAM. Nowa wersja wyszła kilka dni temu. Nie jest to maszyna tak mocna jak AmigaONE, microA1 czy Pegasos ale lepsza od Efiki i nie ma tego chorego ograniczenia pamięci. AmigaOS 4.x też jest komercyjny. O ile użytkowników MorphOS-a w Polsce jest kilkuset to użytkowników AmigaOS4 jest może 10, może 15. Nie orientuję się, bo to nie moja strona barykady. :) W Polsce jest kupa ludzi, którzy programują pod MorphOS. Kilka osób współtworzy nawet sam system (gość od programowej strony wszystkiego co jest związane z oknami, ich działaniem, gość od implementacji OpenGL i częściowo sterowników 3D, gość od filesystemu, expert od nowego systemu datatypów wszelkiego typu, gość od Ambienta czyli jakby odpowiednika Explorera, facet od przeglądarki www, tłumacze). W razie problemów ma kto pomagać. SDK jest dostępne za darmo. Ale jest ciężkie dla kogoś wychowanego na Windows. :)

Oba środowiska bardzo mocno się zwalczają. Mowy nie ma o współpracy. Wojna jest nie do pogodzenia. :) Chociaż jest sporo softu, który wychodzi w wersjach dla trzech ami-platform (np. AmiGG).

Nie jestem obiektywny, bo jestem zwolennikiem MorphOS-a. Ale skoro mam poradzić to proszę...

Jeżeli chciałbyś teraz nagle coś kupić to ja bym kupił używanego Pegasosa II z G4 1 GHz, jakimś Radeonem 128MB, 512 MB RAM. Do tego obowiązkowo kupił MorphOS-a 2.2. Jeżeli możesz poczekać kilka miesięcy to poczekaj aż wyjdzie MorphOS 2.x dla MiniMac. Kupisz wtedy za grosze najlepszego MiniMaca z PPC i heja!
« Ostatnia zmiana: Styczeń 21, 2009, 14:56:15 wysłana przez MDW »