C++/SDL-ohjelmani kaatuu heti kun yritän käynnistää sen. Se ehtii vain avata mustan ikkunan(pitäisi olla valkoinen) ja sitten tulee "ohjelma.exe lakkasi toimimasta" ja sitten ikkuna, jossa valinnat "Virheenkorjaus" ja "Sulje ohjelma". Olen yrittänyt saada sen tulostamaan tietojansa tiedostoon, mutta filu pysyy tyhjillään. Debugannut olen, ja tällainen tulee:
Debuggeri kirjoitti:
Adding source dir: (polku)
Adding source dir: (polku)
Adding file: (polku)\ohjelma.exe
Changing directory to: (polku)
Set variable: PATH=.;(polku)\lib;C:\MinGW\bin;C:\MinGW;C:\Windows\System32;C:\Windows;C:\Windows\System32\ wbem;C:\Windows\System32\WindowsPowerShell\v1. 0;C:\Program Files\Windows Kits\8.0\Windows Performance Toolkit;C:\Program Files\Microsoft SQL Server\110\Tools\Binn
Starting debugger: C:\MinGW\bin\gdb.exe -nx -fullname -quiet -args (polku)
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Reading symbols from (polku)...(no debugging symbols found)...done.
Debugger name and version: GNU gdb (GDB) 7.4
Child process PID: 7232
Program received signal SIGSEGV, Segmentation fault.
In ?? () ()
Googletus ei auttanut. Koodin liitän pyydettäessä, mutta koska käännös onnistui, sitä ei kaiketi tarvitse tähän laittaa.
Segmentation fault johtuu yleensä virheestä muistin käsittelyssä, esimerkiksi alustamattomasta osoittimesta. Debuggauksesi on muuten sujunut aika huonosti. Tulosteessa lukee "no debugging symbols found", eli ohjelmasi on debuggausta ajatellen väärin käännetty. Sinun pitää muuttaa käännösasetuksia tai komentoriviä niin, että ohjelmaa ei optimoida liikaa (-O0
tai enintään -O1
) ja että symbolit ovat mukana (-g
) eikä ohjelmatiedostoa riisuta (strip, -s
pois). Kun kokeilet tämän jälkeen uudestaan, debuggerin pitäisi kertoa, millä rivillä virhe tulee. Komennolla bt
saat gdb:stä tiedon, mitä kautta kyseiselle riville on tultu.
Hengilö kirjoitti:
Koodin liitän pyydettäessä, mutta koska käännös onnistui, sitä ei kaiketi tarvitse tähän laittaa.
Toki tarvitsee, todennäköisesti kun sinun koodisi kyseisen segmentation faultin kuitenkin aiheuttaa.
Kannattaa kuitenkin ensin katsoa gdb:llä tuo rivi, josta kaatuminen tapahtuu, ja jos ei ongelma selkene, sitten liittää relevantit koodit.
No nyt sain taistelun jälkeen gdb:n toimimaan. Debuggeri heittää seuraavanlaista varoitusta lähestulkoon joka riviltä 2-10 kertaa:
gdb kirjoitti:
warning: while parsing target library list: not well-formed (invalid token)
Sitten rivillä 107 (alustusfunktiossa) ohjelma kaatuu Segmentation fault-viesin saattelemana.
Koodi siinä kohtaa:
for(int i = 0; i < 3; ++i) { for(int j = 0; i < 3; ++j) { pelilauta[i][j] = 0; // Rivi 107 } }
Pelilauta on siis globaali int-tyyppinen [3][3]-taulukko. Syy globaaliuteen on se, että kun pelilaudan antaa funktiolle parametriksi, syntyy n. 10 erroria. Pikainen purkkaratkaisu siis. :)
Toisessa silmukassa luuppaat ikuisesti, tällä lienee jotain tekemistä asian kanssa.. ;)
Tarkistappas sen ehto.
Hups... Nyt toimii :) (Arvelinkin jotain tämäntyylistä...)
Käytä pidempiä nimiä, niin ei tule tuollaisia. Tuossakin sarake ja rivi muuttujat olisivat olleet estämässä näkymätöntä ongelmaa.
Loppupeleissä i ja j ovat kuitenkin liian saman näköisiä. Yksi i silmukassa on tietenkin OK, mutta i, j, l tekevät lukemisesta raskasta kolmessa sisäkkäisessä luupissa.
Näin on kantapääni opettanut.
Silmukan debuggaamisen nyt pitäisi kuitenkin triviaalia, kun vain hetken keskittyisi siihen. Ei siinä kuitenkaan ole kuin pari muuttujaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.