Debugger CoolBasicille

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Debugger CoolBasicille

Post by otto90x »

Galgoneer näytti tuossa muutama vuosi sitten uuden hienon idean, esikäsittelijän CoolBasicille ja viimeaikaisen kysynnän vuoksi ajattelin kirjoitella tätä nyt uudestaan paremmaksi. Tässä viimeisin versio.

Virhekohdan visualisointi oli wanhassa versiossa kohtuullisen huono, mutta olen koittanut siihen nyt panostaa enemmän. Debug loki vastaa paremmin koodia ja käyttäjän ei tarvitse lukea läpi monta kertaa samoja rivejä löytääkseen virhekohdan lokitiedostosta.

Esimerkiksi tälläisellä koodilla:

Code: Select all

    
    //debugger messes up default directory
    'DEBUG chdir("..")
    SCREEN 500, 400
   
    Dim Colour(10,10,2,1)//kuvien tiedot
    
    Smooth2D ON

    katto = LoadImage("media/map.bmp")
    ResizeImage katto, 202,152 
    
    runko = MakeImage(200,150)
    MaskImage runko, 255,0,255
    DrawToImage runko //piirretään talo
        Color 255,0,255
        Box 0,0,200,150
        Color 0,0,0
        Box 0,0,75,5
        Box 120,0,80,5
        Box 0,145,80,5
        Box 120,145,80,5
        Box 0,0,5,150
        Box 196,0,5,150
    DrawToScreen
    
    ruoho = MakeObjectFloor ()
    nurmikko = LoadImage ("Media\grass.bmp")
    lehmä = LoadImage("media\cow.bmp")
    
    Color 123,90,0
    Box 50,50,200,150 //piirretään lattia
    Color 0,0,0
    For i =1 To 250 Step 10 //lattia viivat
        Line i,50,i, 200
    Next i
    DrawImage runko, 50,50
    DrawImage lehmä, 70,70
    DrawImage lehmä, 170,120
    
    ExploreImage(katto,49,49) //analysoidaan rakennusta
    
    Cls
    Color 255,255,255
    CenterText 250,200, "20%",2 // merkitään lataus
    DrawScreen
    Cls
    
    Dim Talo(10)
    a# = 0.0
    For i=0 To 10
        talo(i) = OpacityImage(katto,a) //eri näkyvyysarvot
        CenterText 250,200, (20 + i*7) + "%",2 // merkitään lataus
        DrawScreen
        a = a+0.1
    Next i   
    MaskImage talo(0), 255, 0, 255
    
    PaintObject ruoho, nurmikko
    
    mUkko = LoadImage("media/soldier.bmp")
    Dim ukko(3)
    For i= 0 To 360 Step 90
        ukko(i/90) = CloneImage(mUkko)
        RotateImage  ukko(i/90), i
    Next i
    
    posX = 450
    posY = 350
    
    u = 2
    
    Repeat
        
        DrawGame
        
        If KeyDown(205) //könkkö liikutettavuus =D
            posX = posX + 1
            u = 0
        ElseIf KeyDown(203)
            posX = posX - 1
            u = 2
        ElseIf KeyDown(200)
            posY = posY - 1
            u = 3
        ElseIf KeyDown(208)
            posY = posY + 1
            u =1
        EndIf 
        
        If posX > 45 And posX < 260 And posY > 45 And posY < 205 //talon sisällä
            i = 0
        Else
            i = Min(Distance(posX, posY, 150, 125)/39,10) //näkyvyysarvo
        EndIf
            
        
        DrawImage  talo(i), 49,49
        DrawImage ukko(u), posX, posY
        DrawScreen
    
    Forever
    
    
    
    
    
    //esivalmistellaan kuvaa...
    Function ExploreImage(pic,picX,picY)
        picW = ImageWidth(pic)
        picH = ImageHeight(pic)
        ReDim Colour(picW,picH-10,2,1)//laitettaan taulukko uuten kokoon

            Lock()
            For x = 1 To picW
                For y = 1 To picH+5
                    pixel = GetPixel2(pixel *12 + x +2, picY + y -55) //otettaan tausta talteen
                    Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
                    Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
                    Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
                Next y
            Next x
            Unlock()
            DrawToImage pic
            Lock()
            For x = 1 To picW
                For y = 1 To picH
                    pixel = GetPixel2(x,y) //otetaan itse kuva talteen
                    Colour(x,y,0,1) = ((pixel Shl (1*8)) Shr 24)
                    Colour(x,y,1,1) = ((pixel Shl (2*8)) Shr 24)
                    Colour(x,y,2,1) = ((pixel Shl (3*8)) Shr 24) 
                Next y
            Next x
            Unlock()
            DrawToScreen

    EndFunction
    
    
    //luodaan kuva
    Function OpacityImage(pic,op#)
        op = 1-op
        picW = ImageWidth(pic)
        picH = ImageHeight(pic)
        newPic = MakeImage(picW,picH)
        DrawToImage newPic
        Lock()
        For x = 1 To picW
            For y=1 To picH
                R = Colour(x,y,0,1)
                G = Colour(x,y,1,1)
                B = Colour(x,y,2,1)
                ColorR = R+(Colour(x,y,0,0) -R)*op //yhdistetään värit
                ColorG = G+(Colour(x,y,1,0) -G)*op
                ColorB = B+(Colour(x,y,2,0) -B)*op
                PutPixel2 x,y, (ColorB + ColorR Shl 16 + ColorG Shl 8) //pistettään se kasaan
            Next y
        Next x
        Unlock()
        DrawToScreen
        Return newPic
    EndFunction

tuottaa debugger tälläisen lokitiedoston:

Code: Select all

           3:     ´DEBUG chdir(¨..¨)
           4:     SCREEN 500, 400
           6:     Dim Colour(10,10,2,1)//kuvien tiedot
           8:     Smooth2D ON
          10:     katto = LoadImage(¨media/map.bmp¨)
          11:     ResizeImage katto, 202,152 
          13:     runko = MakeImage(200,150)
          14:     MaskImage runko, 255,0,255
          15:     DrawToImage runko //piirretään talo
          16:         Color 255,0,255
          17:         Box 0,0,200,150
          18:         Color 0,0,0
          19:         Box 0,0,75,5
          20:         Box 120,0,80,5
          21:         Box 0,145,80,5
          22:         Box 120,145,80,5
          23:         Box 0,0,5,150
          24:         Box 196,0,5,150
          25:     DrawToScreen
          27:     ruoho = MakeObjectFloor ()
          28:     nurmikko = LoadImage (¨Media\grass.bmp¨)
          29:     lehmä = LoadImage(¨media\cow.bmp¨)
          31:     Color 123,90,0
          32:     Box 50,50,200,150 //piirretään lattia
          33:     Color 0,0,0
          34:     For i =1 To 250 Step 10 //lattia viivat
          35:         Line i,50,i, 200
          36:     Next i
          37:     DrawImage runko, 50,50
          38:     DrawImage lehmä, 70,70
          39:     DrawImage lehmä, 170,120
         109:     Function ExploreImage(pic,picX,picY)
         110:         picW = ImageWidth(pic)
         111:         picH = ImageHeight(pic)
         112:         ReDim Colour(picW,picH-10,2,1)//laitettaan taulukko uuten kokoon
         114:             Lock()
         115:             For x = 1 To picW
         116:                 For y = 1 To picH+5
Error!   117:                     pixel = GetPixel2(pixel *12 + x +2, picY + y -55) //otettaan tausta talteen
         118:                     Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
         119:                     Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
         120:                     Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
         121:                 Next y
Ominaisuudet:

'DEBUG merkkijono koodirivin alussa kertoo että tämä rivi suoritetaan vain debugatessa.
'DEBUGSTART ja 'DEBUGEND aloittavat/jatkavat ja lopettavat debuggauksen siitä kohtaa koodia. Tällöin voidaan debugata vain kohtia
jotka ovat virheherkkiä. Debuggaus kuitenkin verottaa jonkinverran suorituskykyä joten siinäkin mielessä on järkevää valita missä kohtaa koodia debuggausta käytetään. Oletuksena debuggaus kuitenkin tehdään koko koodille, alusta loppuun.

Käyttö:

1. Pura tiedostot paketin IDE kansiosta CoolBasicin IDE kansioon.
2. Mikäli CoolBasic on asennettu johonkin muuhun polkuun kuin C:\Program Files\ niin joudut muokkaamaan plugins.ini tiedoston polut vastaaviksi.
3. Aja koodi normaalisti (F5).
4. Sulje ohjelma.
5. Aja Debugger eli valitse Tools -> Debugger.
6. Odota MAVia tai muuta virhettä tai sulje ohjelma halutessasi.
7. Avaa lokitiedost eli valitse Tools -> Debug Log
8. Aloita tarvittaessa uudelleen kohdasta 3.

Jatkokehitys:

Koska oikean rivin tietäminen ei aina ole tarpeeksi vaan halutaan tietää mikä virheeseen johti olisi tarkoituksena myöhemmin jalostaa Debuggeria siten että se osaisi näyttää vaikkapa muuttujien arvot suoritetuilla riveillä tai näin mahdollisesti suoraan kertoa esim. että "objektin/muistipalan/kuvan arvo on nolla, oletkohan poistanut sen?" Tai jopa suoraan kertoa missä sitä on muokattu.

Kehitysideoita otetaan vastaan ja jos innostusta riittää niin paketista löytyy nykyisen version koodi ja sitähän voi aina vain parantaa.

EDIT: Päivitin versiota 8.1.2011:
- Osaa nyt hakea ohjelman polun automaattisesti, kiitos mainiosta vinkistä misthema!
- Varattujen sanojen (If, Return, Function, yms..) tuki on parempi, kaikki suorittamatta jääneet rivit eivät jää nyt erroriksi ja rivin lokiinkirjoituskohtaa on muutettu hieman
Last edited by otto90x on Sun Jan 08, 2012 11:34 pm, edited 10 times in total.
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Debugger, kun MAV alkaa tympimään.

Post by Viltzu »

Ohhoh! Tämähän on mahtava! Vaikka en enään koodailekkaan CB:llä hirveänä, niin tälle tulee kuitenkin käyttöä vanhoja pelien MAVejen löytämiseen.
Edittaan jtn lisää kun ensin hieman vielä testailen!
Niin ja 50 viesti jei
Vieras

Re: Debugger, kun MAV alkaa tympimään.

Post by Vieras »

otto90x wrote: 6. Odota MAVia tai muuta virhettä tai sulje ohjelma halutessasi.
Just käskettiin neloskohdassa sulkea ohjelma eikä kertaakaan sen jälkeen suorittaa, ja silti nyt pitäs taas sulkea? Pitäskö se ite ohjelma suorittaa ton DebugPreprocessorin jälkeen? Vai pitäskö sitä suorittaa enää ollenkaan ton kolmoskohdan jälkeen?
otto90x wrote: 7. Puhdista lokitiedosto eli valitse Tools -> DebugLogCleaner. Loki avautuu automaattisesti puhdistuksen jälkeen.
Tjaah, ei mulla vaan mitään avaudu. Eikä tapahdu, mitä nyt tiimalasi vilahtaa ruudussa ja se on siinä.

Jos sais vähän selkeempänä nää ohjeet niin ymmärtäs vähän tyhmemmätkin? :oops:
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Debugger, kun MAV alkaa tympimään.

Post by otto90x »

Vieras wrote:
otto90x wrote: 6. Odota MAVia tai muuta virhettä tai sulje ohjelma halutessasi.
Just käskettiin neloskohdassa sulkea ohjelma eikä kertaakaan sen jälkeen suorittaa, ja silti nyt pitäs taas sulkea? Pitäskö se ite ohjelma suorittaa ton Virheentarkastajan jälkeen? Vai pitäskö sitä suorittaa enää ollenkaan ton kolmoskohdan jälkeen?
otto90x wrote: 7. Puhdista lokitiedosto eli valitse Tools -> Virhelogin puhdistaja. Loki avautuu automaattisesti puhdistuksen jälkeen.
Tjaah, ei mulla vaan mitään avaudu. Eikä tapahdu, mitä nyt tiimalasi vilahtaa ruudussa ja se on siinä.

Jos sais vähän selkeempänä nää ohjeet niin ymmärtäs vähän tyhmemmätkin? :oops:
No siis kun tuo Virheentarkastajan pitäisi käynnistää se ohjelma, jonka koodin olet juuri kääntänyt. (Editori käynnistää kääntäjän, kun ohjelma ajetaan normaalisti. Esimerkiksi kun painat F5 näppäintä.)

Lokitiedoston puhdistus ei varmaan onnistu jos ei ole mitään puhdistettavaa, eli toisin sanoen Virheentarkastaja ei ole käynnistynyt, koska ei ole saanut koodia "pureskeltavaksi".


No pistän tähän nyt tälläisen kädestäpitäen oppaan:

Tässä on koodi, jonka juuri kirjoitin.

Code: Select all

auto=MakeObject(20)

Repeat
    //seuraava rivi tahallaan pielessä
    MoveObject auto2,0,0

    DrawScreen

Forever
Testaan sitä painamalla F5 näppäintä, ohjelma käynnistyy ja pian tulee näytölle tuttu virheilmoitus "Memery Access Vialation" (eli kavereille pelkästään MAV) ja ohjelma sammuu. Mehän haluamme tietää missä vika on ja koska emme jaksa tarkistaa meidän 9 rivin pituista koodia, käytämme Virheentarkastajaa.

Virheentarkastajalla on yksi edellytys: ohjelma on pitänyt ajaa ja mehän teimme sen juuri äsken, ei siis mitään hätää. Nyt voimme siis mennä editorin yläreunassa olevaan tools nimiseen valikkoon. Valitsemme sieltä Virheentarkastaja nimisen työkalun. Klikkaamme sitä ja ohjelma käynnistyy taas. Pian ohjelma taas antaa tutun virheilmoituksen MAV. Ohjelma sulkeutuu.

No niin nyt olemme saaneet tietää mikä ohjelmassa on vikana. Se on kirjautunut lokitiedostoon. Koska lokitiedosto ei tässä tapauksessa ole kovin pitkä voisimme avata sen suoraan, mutta käyttömukavuutta ajatellen käytämme toista työkalua, Virhelogin puhdistajaa. Sekin löytyy tools valikosta. Virhelogin puhdistaja käynnistyy ja näyttää meille hetken mustaa ruutua. sitten se käynnistää tekstieditorin ja sammuu itse. Eteemme avautuu seuraavanlainen tekstinpätkä.

Code: Select all

Tässä viimeiset koodirivit.

Rivi 1 yritettiin: auto=MakeObject(20)

Rivi 1 onnistui: auto=MakeObject(20)

Rivi 3 yritettiin: Repeat

Rivi 3 onnistui: Repeat

Rivi 5 yritettiin: MoveObject auto2,0,0
Kaikista tärkein on viimeinen rivi. Eli

Code: Select all

Rivi 5 yritettiin: MoveObject auto2,0,0
se kertoo, että ohjelma yritti suorittaa auto2 objektin liikuttamista, mutta jäi kesken sen kohdalla. Me tiedämme syyn, MAV joka voi periaatteessa tulla mistä virheestä vain, mutta nyt saimme selville, että olimme epähuomiossa laittaneet väärän muuttujan ja näin aiheuttaneet kauhean virheen.
Last edited by otto90x on Sat Sep 20, 2008 12:52 pm, edited 1 time in total.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: Debugger, kun MAV alkaa tympimään.

Post by Sly_Jack0 »

otto90x wrote:Tekstiä....
Kiitos tästä selvityksestä. Nyt älyän sitten minäkin tämän homman ja kuullostaa TODELLA hyödylliseltä. Pitää kokeilla joskus jos iskee myteerinen MAV.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Debugger, kun MAV alkaa tympimään.

Post by MaGetzUb »

Tuosta vielä suomeks nuo tekstit, niin osais vähän nuorempikin koodari. Toki minä tiedän mitä nois teksteissä lukee, mutta en olisi ehkä viel 2 vuotta sitten. Sitä paitsi nytkään ei tarvitsisi muuta kuin lukea eikä ajatella. :D
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Debugger, kun MAV alkaa tympimään.

Post by otto90x »

programmer of DSG wrote:Tuosta vielä suomeks nuo tekstit, niin osais vähän nuorempikin koodari. Toki minä tiedän mitä nois teksteissä lukee, mutta en olisi ehkä viel 2 vuotta sitten. Sitä paitsi nytkään ei tarvitsisi muuta kuin lukea eikä ajatella. :D
Hyvä idea, vaihdoin nyt lokitiedoston ja tools valikon työkalujen nimet suomeksi. Tässä ja aloitusviestissä on suomenkielinen paketti. Se finglish kuulostikin turhalta kikkailulta. :D

EDIT: Ohhoh tulipas kauheaa suomea tuohon ensimmäiseen pakettiin, korvataas vähän paremmaksi.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Virheentarkastaja, kun MAV alkaa tympimään.

Post by kaneli2000 »

Pitäisikö jotain tapahtuakin kun klikkaan mitä tahansa virheenpuhdistajan osaa "Tools" valikossa? Ei nimittäin tapahdu.

Onko ongelma konekohtainen vai enkö vaan ymmärtänyt mitön tätä käytetään :roll:?

EDIT: IDE kansioon tulee ajon jälkeen tiedostot "CompileLog" ja "lastlinecode", molemmat .txt loppuisia. Jotain taitaa sittenkin tapahtua?
I see the rainbow rising
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Virheentarkastaja, kun MAV alkaa tympimään.

Post by otto90x »

kaneli2000 wrote:Pitäisikö jotain tapahtuakin kun klikkaan mitä tahansa virheenpuhdistajan osaa "Tools" valikossa? Ei nimittäin tapahdu.

Onko ongelma konekohtainen vai enkö vaan ymmärtänyt mitön tätä käytetään :roll:?

EDIT: IDE kansioon tulee ajon jälkeen tiedostot "CompileLog" ja "lastlinecode", molemmat .txt loppuisia. Jotain taitaa sittenkin tapahtua?
lastlinecode.txt tulisi olla kansiossa jo ennen virheentarkistajan käynnistämistä. Se tiedosto on asennuspaketissakin.

Olethan nyt varmasti ajanut koodin (painanut f5, odottanut ohjelman lataavan ja sitten sulkenut sen) ennen virheentarkistajan käynnistämistä?
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: Virheentarkastaja, kun MAV alkaa tympimään.

Post by Misthema »

Bump from the past.

Olisi kiva löytää tämä paketti jostain. Ei kellään sattuisi olemaan tätä? MAV:ien metsästys manuaalisest, ilman tällaisia ohjelmia on liiankin turhauttavaa ja on usein sotkenut projektini...joten olisi mukava saada tämä jostain. Anyone?
User avatar
BIG_BOMM
Newcomer
Posts: 7
Joined: Fri Dec 30, 2011 12:08 pm

Re: Virheentarkastaja, kun MAV alkaa tympimään.

Post by BIG_BOMM »

aika loistava ohjelma... tosin auttais enemmän jos sen pystyis myös lataamaan...
kun 2 SHARE sanoo---->
"The file link that you requested is not valid. Please contact link publisher or try to make a search."

tietääkö joku toimivaa linkkiä?
Mans got to do what mans got to do...

FACEPLANT!
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Virheentarkastaja

Post by MetalRain »

Viimeaikaisen kysynnän vuoksi ajattelin kirjoitella tätä nyt uudestaan paremmaksi. Virhekohdan visualisointi oli wanhassa versiossa kohtuullisen huono, mutta olen koittanut siihen nyt panostaa enemmän. Debug loki vastaa paremmin koodia ja käyttäjän ei tarvitse lukea läpi monta kertaa samoja rivejä löytääkseen virhekohdan lokitiedostosta.

Esimerkiksi tälläisellä koodilla:

Code: Select all

    
    //debugger messes up default directory
    'DEBUG chdir("..")
    SCREEN 500, 400
   
    Dim Colour(10,10,2,1)//kuvien tiedot
    
    Smooth2D ON

    katto = LoadImage("media/map.bmp")
    ResizeImage katto, 202,152 
    
    runko = MakeImage(200,150)
    MaskImage runko, 255,0,255
    DrawToImage runko //piirretään talo
        Color 255,0,255
        Box 0,0,200,150
        Color 0,0,0
        Box 0,0,75,5
        Box 120,0,80,5
        Box 0,145,80,5
        Box 120,145,80,5
        Box 0,0,5,150
        Box 196,0,5,150
    DrawToScreen
    
    ruoho = MakeObjectFloor ()
    nurmikko = LoadImage ("Media\grass.bmp")
    lehmä = LoadImage("media\cow.bmp")
    
    Color 123,90,0
    Box 50,50,200,150 //piirretään lattia
    Color 0,0,0
    For i =1 To 250 Step 10 //lattia viivat
        Line i,50,i, 200
    Next i
    DrawImage runko, 50,50
    DrawImage lehmä, 70,70
    DrawImage lehmä, 170,120
    
    ExploreImage(katto,49,49) //analysoidaan rakennusta
    
    Cls
    Color 255,255,255
    CenterText 250,200, "20%",2 // merkitään lataus
    DrawScreen
    Cls
    
    Dim Talo(10)
    a# = 0.0
    For i=0 To 10
        talo(i) = OpacityImage(katto,a) //eri näkyvyysarvot
        CenterText 250,200, (20 + i*7) + "%",2 // merkitään lataus
        DrawScreen
        a = a+0.1
    Next i   
    MaskImage talo(0), 255, 0, 255
    
    PaintObject ruoho, nurmikko
    
    mUkko = LoadImage("media/soldier.bmp")
    Dim ukko(3)
    For i= 0 To 360 Step 90
        ukko(i/90) = CloneImage(mUkko)
        RotateImage  ukko(i/90), i
    Next i
    
    posX = 450
    posY = 350
    
    u = 2
    
    Repeat
        
        DrawGame
        
        If KeyDown(205) //könkkö liikutettavuus =D
            posX = posX + 1
            u = 0
        ElseIf KeyDown(203)
            posX = posX - 1
            u = 2
        ElseIf KeyDown(200)
            posY = posY - 1
            u = 3
        ElseIf KeyDown(208)
            posY = posY + 1
            u =1
        EndIf 
        
        If posX > 45 And posX < 260 And posY > 45 And posY < 205 //talon sisällä
            i = 0
        Else
            i = Min(Distance(posX, posY, 150, 125)/39,10) //näkyvyysarvo
        EndIf
            
        
        DrawImage  talo(i), 49,49
        DrawImage ukko(u), posX, posY
        DrawScreen
    
    Forever
    
    
    
    
    
    //esivalmistellaan kuvaa...
    Function ExploreImage(pic,picX,picY)
        picW = ImageWidth(pic)
        picH = ImageHeight(pic)
        ReDim Colour(picW,picH-10,2,1)//laitettaan taulukko uuten kokoon

            Lock()
            For x = 1 To picW
                For y = 1 To picH+5
                    pixel = GetPixel2(pixel *12 + x +2, picY + y -55) //otettaan tausta talteen
                    Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
                    Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
                    Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
                Next y
            Next x
            Unlock()
            DrawToImage pic
            Lock()
            For x = 1 To picW
                For y = 1 To picH
                    pixel = GetPixel2(x,y) //otetaan itse kuva talteen
                    Colour(x,y,0,1) = ((pixel Shl (1*8)) Shr 24)
                    Colour(x,y,1,1) = ((pixel Shl (2*8)) Shr 24)
                    Colour(x,y,2,1) = ((pixel Shl (3*8)) Shr 24) 
                Next y
            Next x
            Unlock()
            DrawToScreen

    EndFunction
    
    
    //luodaan kuva
    Function OpacityImage(pic,op#)
        op = 1-op
        picW = ImageWidth(pic)
        picH = ImageHeight(pic)
        newPic = MakeImage(picW,picH)
        DrawToImage newPic
        Lock()
        For x = 1 To picW
            For y=1 To picH
                R = Colour(x,y,0,1)
                G = Colour(x,y,1,1)
                B = Colour(x,y,2,1)
                ColorR = R+(Colour(x,y,0,0) -R)*op //yhdistetään värit
                ColorG = G+(Colour(x,y,1,0) -G)*op
                ColorB = B+(Colour(x,y,2,0) -B)*op
                PutPixel2 x,y, (ColorB + ColorR Shl 16 + ColorG Shl 8) //pistettään se kasaan
            Next y
        Next x
        Unlock()
        DrawToScreen
        Return newPic
    EndFunction

tuottaa debugger tälläisen lokitiedoston:

Code: Select all

           3:     'DEBUG chdir("..")
           4:     SCREEN 500, 400
           6:     Dim Colour(10,10,2,1)//kuvien tiedot
           8:     Smooth2D ON
          10:     katto = LoadImage("media/map.bmp")
          11:     ResizeImage katto, 202,152 
          13:     runko = MakeImage(200,150)
          14:     MaskImage runko, 255,0,255
          15:     DrawToImage runko //piirretään talo
          16:         Color 255,0,255
          17:         Box 0,0,200,150
          18:         Color 0,0,0
          19:         Box 0,0,75,5
          20:         Box 120,0,80,5
          21:         Box 0,145,80,5
          22:         Box 120,145,80,5
          23:         Box 0,0,5,150
          24:         Box 196,0,5,150
          25:     DrawToScreen
          27:     ruoho = MakeObjectFloor ()
          28:     nurmikko = LoadImage ("Media\grass.bmp")
          29:     lehmä = LoadImage("media\cow.bmp")
          31:     Color 123,90,0
          32:     Box 50,50,200,150 //piirretään lattia
          33:     Color 0,0,0
          34:     For i =1 To 250 Step 10 //lattia viivat
          35:         Line i,50,i, 200
          36:     Next i
          37:     DrawImage runko, 50,50
          38:     DrawImage lehmä, 70,70
          39:     DrawImage lehmä, 170,120
         109:     Function ExploreImage(pic,picX,picY)
         110:         picW = ImageWidth(pic)
         111:         picH = ImageHeight(pic)
         112:         ReDim Colour(picW,picH-10,2,1)//laitettaan taulukko uuten kokoon
         114:             Lock()
         115:             For x = 1 To picW
         116:                 For y = 1 To picH+5
Error!   117:                     pixel = GetPixel2(pixel *12 + x +2, picY + y -55) //otettaan tausta talteen
         118:                     Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
         119:                     Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
         120:                     Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
         121:                 Next y
'DEBUG merkkijono koodirivin alussa kertoo että tämä rivi suoritetaan vain debugatessa.
'DEBUGSTART ja 'DEBUGEND aloittavat ja lopettavat debug lokin kirjoituksen. Tällöin voidaan debugata vain kohtia, jotka ovat virheherkkiä. Debuggaus kun kuitenkin verottaa jonkinverran suorituskykyä, joten siinäkin mielessä on järkevää valita missä kohtaa koodia debuggausta käytetään. Oletuksena debuggaus kuitenkin tehdään koko koodille.

Asennus onnistuu kopioimalla paketin IDE kansion sisällön CoolBasic IDE kansion sisälle. Ja muuttamalla plugins.ini tiedoston polkuja mikäli CoolBasic on käynnistetty muualle kuin C:\Program Files\CoolBasic\ kansioon ja käynnistämällä CoolBasic editorin uudelleen.

Käyttö on sama vanha:
Suorita ensin ohjelmakoodi jossa tiedät olevan virheen. Kun koodi on käännetty ja ohjelma käynnistyy, voit sulkea sen välittömästi. Käynnistä sitten debugger ja kun virhetilanne tulee voit sulkea ohjelman.
Tämän jälkeen avaa debug log.

Nämä kaksi työkalua (debugger & debug log) löytyy siis editorin tools kohdan alta.

Paketin sisältönä on:
- plugins.ini joka mahdollistaa työkalujen käytön CoolBasic editorista.
- debugLayout.txt jonka tarkoituksena on lähinnä mahdollistaa debuglogin ulkoasun muokkauksen ilman debuggeriin koskemista
- preprocessor.cb ja sitä vastaava exe jotka siis huolehtivat debug koodin luonnista suoritetun koodin pohjalta ja uuden koodin ajamisesta.
Last edited by MetalRain on Sun Jan 08, 2012 11:30 pm, edited 8 times in total.
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: Debugger CoolBasicille

Post by Misthema »

Loistavaa! Ainoa minkä kokeillessani huomasin, oli että lähdekoodien paikkaa ei tiedosteta. Eli jos koodissa on jotain mitä ladataan lähdekoodin tiedostopoluilta, esimerkiksi 'config.ini', niin debuggeri ei ymmärrä tätä ja heittää erroria siihen kohtaan koodia jossa tiedostoa yritetään avata - mahdollinen MAV jää siis löytymättä.

Tämä on varmasti helppo korjata ja laittaa debugger huomioimaan "Compiler" -tiedoston sisältöä:

Code: Select all

type=1
sourcedir=C:\Program Files\CoolBasic\Projektit\Peli\
buildto=C:\Program Files\CoolBasic\IDE\cbRun
force=0
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Debugger CoolBasicille

Post by Konstaduck »

Minulla heittää jostain aivan tuntemattomasta syystä Waitkeyn kohdalla erroria. mahdollinen MAV jää siis löytymättä :(
Konstaduck.net
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Debugger CoolBasicille

Post by otto90x »

Loistava vinkki tuo oletuspolun hakeminen, aiemmin tuota compiler tiedostoa silmäilinkin vaan kun sen sisältö generoituu vasta ohjelman ajon jälkeen niin en tajunnut sen mahdollisuuksia, kiitos misthema. Laitoin tuon nyt käyttöön ja muutamalla testikeissillä kokeiltuna toimikin vallan mainiosti.
Konstaduck wrote:Minulla heittää jostain aivan tuntemattomasta syystä Waitkeyn kohdalla erroria. mahdollinen MAV jää siis löytymättä :(

Tämä johtuu siitä miten debugger nykyisellään toimii. Error kirjoitetaan lokiin ennen kuin rivi suoritetaan ja poistetaan kun rivi on suoritettu onnistuneesti. Mikäli waitkey jää odottamaan käyttäjän painallusta, ei virhettä poisteta koskaan lokista. Sama asia tapahtuu myös sisäkkäisissä funktiokutsuissa, mikäli sisemmässä tapahtuu virhe jää myös aiempien kutsujen riveille merkintä virheestä, sillä niitä ei saatu suoritettua loppuun.

Parina iltana tässä koodailin muuttujien tunnistusta ja arvojen näyttämistä lokitiedostossa. Toistaiseksi pahin pullonkaula on tyyppikokoelmien osoitinmuuttujat esim.

Code: Select all

a.Auto = new(Auto)
delete a
Vaikka ensimmäisen rivin jättäisi huomiotta koska huomaa sillä käytettävän tyyppikokoelman nimeä niin seuraavalla rivillä muuttuja a näyttää yksinkertaisen parserin silmiin varsin viattomalta muuttujalta, mutta toisin kuin muut muuttujat sitä ei voida muuntaa suoraan merkkijonoksi vaan se pitäisi pyöräyttää ensin converttointeger funktion avulla kokonaisluvuksi. Tästä syystä jätin osittain toimimattoman muuttujien arvojen näytön pois tästä versiosta. Täytyy katsoa josko tämän ongelman tulevissa päivityksissä saa korjattua.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: Debugger CoolBasicille

Post by Misthema »

Tuohon osoittimeen viitaten.. Eikös se onnistuisi, jos ensin aina poimitaan komento muistiin, tai merkitään minkä sisälle mennään (for, repeat, function jne) - en oikein muista kuinka nuo muuttujat näkyvät ulos esim. forloopista, kuitenkin - sen jälkeen jos siellä on määritelty esimerkiksi tuo
a.Auto = new(Auto), niin koko lötkö 'a.Auto' otetaan muistiin, ja jos sen jälkeen näkyy Delete a, niin se on silloin oikein.
Jos taasen olisi Delete b, eikä 'a', ja aikaisemmin ei olisi määritelty mitään tyyppiosoitinta nimeltä 'b', niin silloin tämä olisi virhe ja error osuu riville 'Delete b'. Miten tämä voisi toimia?
EDIT:

Huomasin peliäni debugatessa, että aliohjelmien Return:t määritellään suoraan virheiksi. Tällä ei tietenkään ole mitään merkitystä, mutta ajattelin kuitenkin ilmoittaa. Aliohjelmia on varmaan vaikea parsia..?

User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Debugger CoolBasicille

Post by MetalRain »

Jees eli uutta versiota pukkaa, sain selvitettyä sen ongelman tyypien ja taulukoiden parsimisessa koodista ja nyt debuglokin koodirivien perässä näytetään muuttujien arvot mikäli mahdollista. Voi kuitenkin olla että ongelmia tämän version kanssa vielä ilmenee, kauhean paljon en ole ehtinyt testata. Siksi pidän vielä vanhaa versiota

Kun ajataan debuggerilla tämä esimerkki:

Code: Select all

FrameLimit 40  'rajoita nopeutta
DrawToWorld ON 'mahdollistaa piirtämisen maailmaan

'lataa kartta
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
ObjectPickable kartta, ON 'aseta se poimittavaksi
PlayObject kartta,0,0,1 'animoi kartta

'lataa pelaaja
ukko = LoadObject ("Media\guy.bmp",72)

'lataa vihulainen
vihu = LoadObject ("Media\guy.bmp",72)
ObjectPickable vihu, 2 'aseta se poimittavaksi
PositionObject vihu, 32,150 'sijoita ylemmäs

'törmäykset
SetupCollision ukko, vihu, 2, 2, 2
'kartta-törmäykset on hyvä esitellä viimeiseksi
SetupCollision ukko, kartta, 1, 4, 2

Repeat

    'Ukon ohjaus
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,2
    If DownKey() Then MoveObject ukko,-2

    UpdateGame
    CloneCameraPosition ukko    
    
    DrawGame 'tämä komennetaan ennen piirtokomentoja
    
    'suorita poiminta
    ObjectPick ukko
    e=PickedObject()
    
    'jos poiminta osui vihuun
    If e=vihu Then
        Color cbMagenta
        Circle PickedX()-4,PickedY()+4,8,OFF
    EndIf
    
    'jos poiminta osui karttaan
    If e=kartta Then
        Color cbGreen
        Circle PickedX()-4,PickedY()+4,8,OFF    
    EndIf

    DrawScreen 'piirrä näyttö

Forever
Voi debug lokin sisältö näyttää kutakuinkin tältä:

Code: Select all

             2: FrameLimit 40  'rajoita nopeutta 
             3: DrawToWorld ON 'mahdollistaa piirtämisen maailmaan 
             6: kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp") || kartta=1
             7: ObjectPickable kartta, ON 'aseta se poimittavaksi || kartta=1
             8: PlayObject kartta,0,0,1 'animoi kartta || kartta=1
            11: ukko = LoadObject ("Media\guy.bmp",72) || ukko=2
            14: vihu = LoadObject ("Media\guy.bmp",72) || vihu=3
            15: ObjectPickable vihu, 2 'aseta se poimittavaksi || vihu=3
            16: PositionObject vihu, 32,150 'sijoita ylemmäs || vihu=3
            19: SetupCollision ukko, vihu, 2, 2, 2 || ukko=2 vihu=3
            21: SetupCollision ukko, kartta, 1, 4, 2 || ukko=2 kartta=1
            23: Repeat 
            26:     If LeftKey() Then TurnObject ukko,5 || ukko=2
            27:     If RightKey() Then TurnObject ukko,-5 || ukko=2
            28:     If UpKey() Then MoveObject ukko,2 || ukko=2
            29:     If DownKey() Then MoveObject ukko,-2 || ukko=2
            31:     UpdateGame 
            32:     CloneCameraPosition ukko     || ukko=2
            34:     DrawGame 'tämä komennetaan ennen piirtokomentoja 
            37:     ObjectPick ukko || ukko=2
            38:     e=PickedObject() || e=1
Pass ->     41:     If e=vihu Then || e=1 vihu=3
            47:     If e=kartta Then || e=1 kartta=1
            48:         Color cbGreen 
            49:         Circle PickedX()-4,PickedY()+4,8,OFF     
            50:     EndIf 
            52:     DrawScreen 'piirrä näyttö 
            54: Forever 
Misthema wrote:Huomasin peliäni debugatessa, että aliohjelmien Return:t määritellään suoraan virheiksi. Tällä ei tietenkään ole mitään merkitystä, mutta ajattelin kuitenkin ilmoittaa. Aliohjelmia on varmaan vaikea parsia..?
Vaihdoin return komennon tyypin siten ettei se luo virheilmoituksia ollenkaan. (Käytännössä mahdotonta tietää onnistuiko return rivin suoritus, koska sitä voi kutsua mistä vain ja se voi palata minne vain. Lähinnä tämän huomaa vain siitä että funktion kutsurivillä näkyy virheilmoitus.)

Seuraavaksi olisi tarkoituksena parantaa debuggerin toimintaa riveillä joita on jatkettu kaksoispisteen avulla, nyt toiminta riveillä tunnistaan lähes pelkästään siitä miten rivi alkaa tai mitä sanoja se sisältää, mutta tälläiset rivit saattavat toimia todella huonosti tai jättää näyttämättä virheitä.
VerkkoGuru
Member
Posts: 73
Joined: Sat Feb 25, 2012 3:42 pm

Re: Debugger CoolBasicille

Post by VerkkoGuru »

Bugi?

Teen kuten käsketään: Ajan ohjelman ja odotan virheilmoitusta(Not enough frames in bitmap). Koska ohjelmassani on monia animoituja objekteja, en voi sanoa, missä kohi on vikaa, joten olen nyt ajanu ohjelmani ja otan debuggerin, joka ajaa sen ohjelman uudestaan sittena vaan debug_login painamalla mitä tahansa näppäintä ja se sanoo, että virhe on tässä:

Code: Select all

Dim i as integer
Voiko taulukossa olla frameja? Ei. Teinköhän jotain väärin vai onko tässä rivillä jotain häikkää vai onko tämä tosiaan vain bugi?
EDIT:

Hyi kun tuli epäselvää tekstiä..

Post Reply