Ajattelin kirjoitella hieman asiaa Symbian-ohjelmoinnista näin suomeksi, jos siitä olisi
jollekin hyötyäkin. Kaikenlaista on tullut vastaan ja voi sanoa ettei vieläkään paljoa tuosta
hirvityksestä tiedä. Mutta oppia ikä kaikki.
Virheilmoitukset
"Emulaattori" on siitä surkea laitos, ettei se anna kovinkaan hyviä virheilmoituksia
kehittäjälle, jos antaa mitään. Siinä mielessä toimii täysin samoin kuin oikeakin käyttis.
Hieman parempaa tietoa virheistä saa joka tapauksessa luomalla emulaattorin asennushakemiston
alla olevaan Epoc32\wins\c\System\Bootdata-hakemistoon tiedoston errrd.
Huomaa kolme R-kirjainta ja ei tiedostopäätettä. Tämän jälkeen emulaattori kertoo paniikin
syyn ja myös esimerkiksi muistivuotopaniikeissa osoitteen, joka jäi vapauttamatta. Tämä
toimii myös kännyköissä (siellä hakemisto tietysti C:\System\Bootdata, vaatii
uudelleenkäynnistyksen).
Debug-moodi
Aja aina kehityskoodia debug-emulaattorilla! Debug-moodissa emulaattori
panikoi ohjelmaa suljettaessa jos esimerkiksi muistia on jäänyt vapauttamatta tai et ole
sulkenut jotain resurssioliota (R-alkuiset luokat).
Muistivuodot
Muistivuotojen löytämiseen kannattaa käyttää
HookLogger-työkalua.
Asenna työkalu ja lue mukana tullut esimerkki. Vakiona mainittu hookeuser-komento
ei yleensä toimi (luonnollisesti, onhan kyse Symbianista) vaan skriptiä pitää muokata.
Skripti löytyy vakiona hakemistosta Program Files\Common Files\Symbian\Tools. Avaa
hookeuser.pl, korjaa seuraavat rivit:
74: my $cmd = "copy \"$hooks_src\"";
77: $cmd = "\"$Bin/AttachDll\" $euser $hooks $hooked_euser";
Virhe johtuu siitä, ettei oteta huomioon vakiohakemistossa olevan välilyöntejä, joten
komennot sekoavat.
Tämän jälkeen mene SDK:n juureen ja aja komento hookeuser wins. Tämän jälkeen
HookLogger on käytössä.
Käynnistä ensin HookLogger ja sen jälkeen debug-emulaattori. Saatat saada virheen, jossa
kerrotaan UID-filtteröinnin olevan toimimaton. Tämä ei ole vaarallista, mutta aiheuttaa sen,
ettei HookLogger osaa erotella sinun ohjelmasi ja muiden ohjelmien muistinvarauksia.
Käynnistä ohjelmasi, tee mitä ohjelmalla tekisit ja sulje se. Tämän jälkeen jos saat
paniikin muistiongelmasta, jätä se emulaattorin ruutuun. Avaa HookLoggerista Heap-välilehti,
paina List all allocs ja odota. Listaus kestää jonkin aikaa. Tämän jälkeen järjestä
lista Ptr-kohdan mukaan ja etsi emulaattorin antama osoite (listan loppupäässä). Valitse
rivi jolla osoite on ja paina Alloc details. Saat kutsupinon, josta näet missä
kohtaa muisti varattiin. Korjaa koodisi siten, että muisti vapautetaan.
Paniikkikoodeja
- USER 45
- Tämä tarkoittaa yleensä
sitä, että olet vapauttanut muistia, muttet ole asettanut osoitinta NULLiksi ja yrität vapauttaa
muistia uudelleen. Tämä osoite ei kuitenkaan enää ole varatun muistin alkukohta, joten saat
tämän virheen.
- CONE 36
- Tämä koodi tarkoittaa sitä, että sinulla on joku resurssiolio (R-alkuiset
luokat) avattuna etkä ole sulkenut sitä. Käytätkö esimerkiksi RFs-luokkaa, muttet sulje?
Emulaattorin näppäinkomennot
Emulaattorissa on muunmuassa seuraavat näppäinkomennot käytettävissä:
- Ctrl-Shift-Alt-T
- Avaa taskinhallinnan josta voi vaihtaa sovellusta
- Ctrl-Shift-Alt-A
- Kertoo paljonko muistia senhetkinen sovellus vie
- Ctrl-Shift-Alt-K
- Tappaa senhetkisen sovelluksen