3500 rivin joukossa on jossain luultavasti SDL_FreeSurface virhe, koska peli kaatuu aina silloin tällöin huoneissa siirtyessä erroriin: 0x3. Ensin luulin, että tietyt tapahtumat toistuessa se tapahtuu, mutta valheellista tietoa, koska se tapahtuu vaikka tuo kaava rikkoutuisikin.
Toinen vaihtoehto on vectorit. Joku vectori puuttuu vaikka sen ei kuuluisi puuttua. (Tälläinen virhe oli jo aikasemmin ja sain korjattua)
Eli kysymys kuuluu. Onko ohjelmalle mahdollista antaa komentoa, että jos ohjelma meinaa kaatua erroriin 0x3 kirjoitetaan jotain konsoliin jotain tietoa, että missä kohtaan tarkalleen virhe sattui.
Kirjoita kuvapintojen käsittelyfunktioon jokin sopiva tarkistus. Esimerkiksi ennen pinnan käsittelyä tarkistat onko pinta valmiina käyttöön, vai oletko vanhingossa jo vaoauttanut sen. Samoin ennen vectorin käyttöä tarkistat onko vectori valmis käyttöön.
3500 riviä ei kuulosta kovin hankalalta määrältä, jos koodi toteutettu järkevästi. Toivottavati olet muuttanut koodaustyyliäsi.
Tällaisessa tilanteessa debuggeri (http://fi.wikipedia.org/wiki/Debuggeri) on kätevä: aja ohjelmasi debuggerissa ja sen kaatuessa näet, missä kohtaa koodia ollaan menossa. Debuggerista voi myös esimerkiksi tutkia eri muuttujien arvoja, ja voit laittaa koodin suorituksen pysähtymään kun saavutaan tietylle riville.
Ohjelmaa on mahdollista helposti muokata esikäsittelijällä niin, että se tulostaa ennen ja jälkeen halutun funktiokutsun tietoa konsoliin. Tätä ei välttämättä kannata ottaa yleiseksi tavaksi, koska se voi aiheuttaa yllättäviä tilanteita, mutta tässä tapauksessa se saattaa auttaa virheen paikantamisessa. Kokeilu ei ainakaan vie paljoa aikaa.
Oletetaanpa, että joku on kämmännyt, ja vapauttaa kahdesti saman osoittimen kautta saman muistialueen.
/* wtf? */ free(blah); free(blah);
Tästä saa kaikenlaista jännää tietoa jo glibc:n virheentarkistuksen kautta, esimerkiksi, mutta jos nyt haluaisimme myös ohjelman kautta jotakin, voimme sanoa näin:
#define free(x) (printf("rivilla %d free-operaatio\n", __LINE__), free(x), printf("suoritettu\n"))
Tämä korvaa kaikki free-kutsut ohjelmassa paketilla operaatioita, joissa on mukana tulostusta. Nyt tulee konsoliin juttua. Ja koska tulostus jatkuu operaation jälkeen, näkee jälkimmäisen osan puuttumisesta, että ohjelma kaatui juuri ympäröidyn operaation aikana.
Näin alkaa esimerkiksi hyvin yksinkertaisen esimerkkiohjelman tulostus minun testini jäljiltä:
rivilla 8 free-operaatio suoritettu rivilla 9 free-operaatio *** glibc detected *** ./a.out: double free or corruption (fasttop) [backtrace jätetty pois]
Nyt siis kävi niin, että rivillä 9 ei suoritus jatkunut free-kutsun jälkeen.
Suosittelen käyttämään tätä vain nopeaan debuggaukseen. Oikea debuggeri on yleensä parempi vaihtoehto, ja oikeassa koodissa turha makroilu voi aiheuttaa kaikenlaista vaivaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.