1. Debuggaus

Lue monisteen luku 10.3 Debuggaus. Katso tehtävää tehdessä myös Wiki-sivua debuggaus.

2. Askeltaminen debuggerissa ja lokaalit muuttujat

MAC HUOM!. Alla olevissa ohjeissa on aina Debug -jotakin. Xamarinissa vastaava menu on Run. Lisäksi Macissa pikanäppäimet ovat oletuksena erit, ne näkee sieltä Run-menun alta.

Aluksi harjoitellaan askeltamista eri tavoin. Samoin opetellaan seuraamaan lokaaleja muuttujia.

  • Tee uusi Solution (vaikkapa nimelle Demo5) ja projekti 'Debuggaus' (Console Application tai vielä mieluummin Jypelin alta ConsoleMain).

  • Copy-pasteta sinne kaiken päälle seuraava sisältö:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace LaskentaaMalli
    {
        public class LaskentaaMalli
        {
            public static void Main(string[] args)
            {
                double kanta = 5;
                double korkeus = 7;
                double ala;
                ala = KolmionAla(kanta, korkeus);
                System.Console.WriteLine(ala);
                System.Console.WriteLine("Valmis");
            }
            /// <summary>
            ///
            /// </summary>
            /// <param name="kanta"></param>
            /// <param name="korkeus"></param>
            /// <returns></returns>
            public static double KolmionAla(double kanta, double korkeus)
            {
                double a = kanta * korkeus / 2;
                return a;
            }
        }
    }    
  • Paina F11 tai klikkaa Debug -> Step into (suomeksi askella). Ohjelma käynnistyy debuggaustilaan. Keltainen nuoli vasemmalla näyttää, mitä koodiriviä seuraavaksi suoritetaan.

  • Paina uudestaan F11. Askellettiin riville 11. Alhaalla näkyy 'Locals'-paneeli, jossa on paikalliset muuttujat. (Jos Locals-paneelia ei näy, sen saa esille valitsemalla yläpalkista Debug -> Windows -> Locals.) args-taulukon alapuolella on kanta, korkeus ja ala, joiden arvo on tällä hetkellä 0.0.

  • Paina taas F11. Ollaan rivillä 12. Kanta-muuttujan arvoksi muuttui 5.0. Visual Studio näyttää viimeksi muuttuneen arvon punaisella.

  • Paina niin kauan F11, että tullaan KolmionAla-aliohjelmakutsuun. Kun vielä kerran painat F11, hypätään riville 25 ja KolmionAla-aliohjelman sisään. Huomaatko, että Locals-paneeli muuttui, siellä ei enää ole samoja muuttujia kuin Main-aliohjelmassa ollessamme (nyt emme enää ole Mainissa).

  • Huomaa myös, että rivi, jolta pomppasimme KolmionAla-aliohjelman sisään, on nyt harmaana. Näin ohjelma tietää, mille riville palataan sen jälkeen, kun KolmionAla-aliohjelman suoritus loppuu.

  • Sama asia selviää myös Locals-paneelin oikealla puolella olevasta Call Stack (kutsupino) -paneelista. Se ohjaa ohjelman suoritusta. Ylimpänä oleva asia suoritetaan seuraavaksi, ja alempana olevat asiat sen jälkeen.

  • Paina F11 niin kauan että tullaan KolmionAla-aliohjelman viimeiselle riville. Mitä luulet tapahtuvan kun vielä kerran painat F11? Ennen painamista mieti, mihin keltainen nuoli seuraavaksi osoittaa.

  • Klikkaa F11 niin kauan, että tullaan System.Console.WriteLine("Valmis");-riville, ja vielä kerran 'F11'.

  • Paina F11 niin kauan että ohjelman suoritus päättyy.

  • Kokeile tehdä sama homma uudestaan. Pysytkö kärryillä ohjelman suorittamisessa? Erityisen tärkeitä ovat Locals-paneeli ja Call Stack.

  • Jos haluat keskeyttää debuggauksen, paina Shift + F5 tai stop-painike Visual Studiossa.

  • Aloita vielä kerran ohjelman suoritus painamalla F11. Tullessasi KolmionAla-aliohjelmakutsun kohdalle (rivi 14), paina F10 (Debug -> Step over). Mitä tapahtui? Osaatko selittää toiminnon nimen "Step over" ja tapahtuneen välisen yhteyden?

3. Keskeytyskohta (break point)

Harjoitellaan keskeytyskohdan lisäämistä ja ajamista keskeytyskohtaan.

  • Tee äsken luomaasi solutioniin uusi projekti Debuggaus2 painamalla Solutionin nimen päällä hiiren oikeaa ja sitten Add New Project.

  • Mikäli tiedoston nimeksi tuli Program.cs muuta se nimeksi Jarjesta.cs

  • Kopioi alla oleva koodi ja liitä se juuri tekemäsi tiedoston sisällön tilalle

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace Debuggaus
    {
        /// <summary>
        /// Harjoitellaan debuggerin käyttöä ja olioviitteitä.
        /// </summary>
        public class Jarjesta
        {
            /// <summary>
            /// Järjestetään taulukon 2 ekaa lukua järjetykseen.
            /// </summary>
            /// <param name="numerot">Järjestettävä taulukko.</param>
            public static void Jarjesta2(int[] numerot)
            {
                if (numerot[0] < numerot[1]) return;
                int t = numerot[0];
                numerot[0] = numerot[1];
                numerot[1] = t;
            }
    
            /// <summary>
            /// Vaihtaa, mutta ei toimi?
            /// </summary>
            /// <param name="a">1. luku</param>
            /// <param name="b">2. luku</param>
            public static void Jarjesta2(int a, int b)
            {
                if (a < b) return;
                int t = a;
                a = b;
                b = t;
            }
    
            /// <summary>
            /// Pääohjelmassa luodaan int-taulukko jossa 2 alkiota.
            /// Kutsutaan järjestä-aliohjelmia.
            /// </summary>
            /// <param name="args"></param>
            public static void Main(String[] args)
            {
                              // 0   1
                int[] luvut = { 34, 21 };
                Console.WriteLine(luvut[0] + " " + luvut[1]);
                Jarjesta2(luvut[0], luvut[1]);
                Console.WriteLine(luvut[0] + " " + luvut[1]);
                Jarjesta2(luvut);
                Console.WriteLine(luvut[0] + " " + luvut[1]);
            }
        }
    }    
  • Lue ohjelman kommentit läpi.

  • Laita keskeytyskohta (breakpoint) riville, jossa lukee Jarjesta2(luvut). Keskeytyskohta laitetaan klikkaamalla koodi-ikkunan vasempaan reunaan, harmaalle alueelle.

  • Laita ohjelma käyntiin (F5). Ohjelman ajo keskeytyy debuggaus-tilaan riville 49.

  • Askella aliohjelman Jarjesta2 sisään painamalla F11 (Step Into).

  • Avaa Locals-välilehti ruudun alareunasta. numerot-muuttujan kohdalla on pieni plus-merkki, josta voit tarkastella muuttujassa olevia tietoja.

  • Askella aliohjelma läpi F11:llä.

  • Kun palaat pääohjelmaan, klikkaa F5, jolloin ohjelma ajaa itsensä loppuun saakka ilman askellusta.

  • Poista nyt keskeytyskohta klikkaamalla punaista ympyrää.

  • Laita keskeytyskohta riville 47 ja debuggaa F5:llä.

  • Askella jälleen aliohjelman sisään, avaa Locals-välilehti ja tutki mitä tapahtuu.

  • Palatessasi pääohjelmaan klikkaa F5 ja ohjelman suoritus menee loppuun saakka ilman askellusta.

  • Yritä selvittää, miksi aliohjelmakutsu Jarjesta2(luvut[0], luvut[1]) ei toimi: pääohjelmassa tulostuu luvut alkuperäisessä järjestyksessä. Vinkki: monisteen luku 14. Olioiden ja alkeistietotyyppien erot.

  • Tarvittaessa breakpointtiin voidaan asettaa ehtoja (Conditional Breakpoint). Tämä tapahtuu klikkaamalla breakpointtia hiiren oikealla ja valitsemalla Condition. Tämän tekemiseen kannattaa tutustua huolella, sillä debug-näytteessä sitä kysytään. Ks. esim. Ehdollisen keskeytyskohdan laittaminen

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.