Megosztás a következőn keresztül:


Hibakeresés abszolút kezdőknek

A szoftverfejlesztőként írt kód nem mindig azt teszi, amire számítottunk. Néha valami teljesen mást csinál! Amikor a váratlan esemény bekövetkezik, a következő feladat annak kiderítése, hogy miért, és bár előfordulhat, hogy kísértésbe kerülünk, hogy csak órákig bámuljuk a kódot, egyszerűbb és hatékonyabb egy hibakereső eszköz vagy hibakereső használata.

A hibakereső sajnos nem olyan dolog, amely varázslatosan felfedi a kód összes problémáját vagy "bugját". hibakeresési azt jelenti, hogy lépésről lépésre futtatja a kódját egy hibakereső eszközben, például a Visual Studióban, hogy megtalálja a pontos pontot, ahol programozási hibát követett el. Ezután megtudhatja, hogy milyen javításokat kell végrehajtania a kódban és a hibakeresési eszközökben, amelyek lehetővé teszik, hogy ideiglenes módosításokat hajthasson végre, hogy továbbra is futtathassa a programot.

A hibakereső hatékony használata olyan képesség is, amely időt és gyakorlatot igényel a tanuláshoz, de végső soron minden szoftverfejlesztő számára alapvető feladat. Ebben a cikkben bemutatjuk a hibakeresés alapvető alapelveit, és tippeket adunk az első lépésekhez.

A probléma tisztázása a megfelelő kérdések feltevésével

Segít tisztázni a problémát, amelybe belefutott, mielőtt megpróbálná kijavítani. Azt várjuk, hogy már belefutott egy problémába a kódban, különben nem lenne itt, hogy kitalálja, hogyan lehet hibakeresést végezni! Ezért mielőtt elkezdené a hibakeresést, győződjön meg arról, hogy azonosította a megoldandó problémát:

  • Mire számítottál a kóddal kapcsolatban?

  • Mi történt helyette?

    Ha hibát (kivételt) tapasztal az alkalmazás futtatása közben, az jó dolog lehet! Kivételnek számít a kód futtatásakor váratlan esemény, amely általában valamilyen hiba. A hibakeresési eszköz pontosan arra a helyre viszi a kódban, ahol a kivétel történt, és segíthet a lehetséges javítások kivizsgálásában.

    Ha valami más történt, mi a probléma tünete? Már gyanítja, hogy hol történt ez a probléma a kódban? Ha például a kód valamilyen szöveget jelenít meg, de a szöveg helytelen, akkor tudja, hogy az adatok hibásak, vagy a megjelenítendő szöveget beadó kód valamilyen hibával rendelkezik. Ha egy hibakeresőben végiglépked a kódon, megvizsgálhatja a változók minden egyes módosítását, hogy pontosan kiderítse, mikor és hogyan vannak hozzárendelve helytelen értékek.

A feltételezések vizsgálata

Mielőtt megvizsgál egy hibát vagy hibát, gondolja át azokat a feltételezéseket, amelyek miatt egy bizonyos eredményt várt. A rejtett vagy ismeretlen feltételezések akadályozhatják a probléma azonosítását akkor is, ha a hibakeresőben közvetlenül a probléma okára nézünk. Lehet, hogy hosszú listád van a lehetséges feltételezésekből! Íme néhány kérdés, amelyeket fel kell tennie magának, hogy megkérdőjelezze a feltételezéseit.

  • A megfelelő API-t használja (azaz a megfelelő objektumot, függvényt, metódust vagy tulajdonságot)? Előfordulhat, hogy egy ön által használt API nem azt teszi, amit gondol. (Miután megvizsgálta az API-hívást a hibakeresőben, a javításhoz szükség lehet a dokumentáció átnézésére a megfelelő API azonosításához.)

  • Helyesen használ API-t? Lehet, hogy a megfelelő API-t használta, de nem a megfelelő módon használta.

  • A kód tartalmaz elírásokat? Egyes elírások, például egy változónév egyszerű elírása, nehezen láthatók, különösen akkor, ha olyan nyelvekkel dolgoznak, amelyek nem igénylik a változók deklarálását a használatuk előtt.

  • Módosította a kódot, és feltételezi, hogy nem kapcsolódik a tapasztalt problémához?

  • Várta, hogy egy objektum vagy változó tartalmazzon egy bizonyos értéket (vagy egy bizonyos típusú értéket), amely eltér a valóditól?

  • Ismeri a kód szándékát? Gyakran nehezebb hibakeresést végezni valaki más kódjában. Ha nem az Ön kódja, előfordulhat, hogy időt kell töltenie azzal, hogy pontosan megtanulja, mit tesz a kód, mielőtt hatékonyan hibakeresést végezhetne.

    Borravaló

    Kód írásakor kezdjen kicsivel, és kezdje a működő kóddal! (Itt hasznos a jó mintakód.) Néha könnyebb kijavítani egy nagy vagy bonyolult kódkészletet egy kis kódrészlettel, amely bemutatja az elérni kívánt alapvető feladatot. Ezután növekményesen módosíthatja vagy hozzáadhatja a kódot, és minden egyes ponton tesztelheti a hibákat.

A feltételezések megkérdőjelezésével csökkentheti a kódban található probléma megtalálásához szükséges időt. Csökkentheti a probléma megoldásához szükséges időt is.

Hibakeresési módban haladjon végig a kódon, és keresse meg, hol történt a probléma

Amikor általában futtat egy alkalmazást, a hibák és a helytelen eredmények csak a kód futtatása után jelennek meg. Előfordulhat, hogy egy program váratlanul leáll, és nem mondja el, miért.

Ha egy alkalmazást egy hibakeresőn belül futtat, más néven hibakeresési módot, a hibakereső aktívan figyeli a program futása közben zajló eseményeket. Azt is lehetővé teszi, hogy bármikor szüneteltetje az alkalmazást az állapotának vizsgálatához, majd lépésenként végiglépkedjen a kódsoron, hogy minden részletet megfigyeljen.

A Visual Studióban a F5 billentyűparanccsal (vagy az Hibakeresés>Hibakeresés indítása menüparanccsal vagy a Hibakeresés indítása gombbal , amely a Hibakeresés indítása gombot ábrázoló ikonnal rendelkezik a Hibakeresési eszköztáron) léphet be a hibakereső módba. Ha bármilyen kivétel történik, a Visual Studio kivételsegítője pontosan arra a pontra viszi, ahol a kivétel történt, és további hasznos információkat nyújt. További információ a kód kivételeinek kezeléséről: Hibakeresési technikák és eszközök.

Ha nem kap kivételt, valószínűleg van egy jó ötlete, hogy hol keresse a problémát a kódban. Ebben a lépésben a hibakeresővel használja a töréspontokat, hogy alaposabban megvizsgálhassa a kódját. A töréspontok a megbízható hibakeresés legalapvetőbb és leglényegesebb funkciói. A töréspont azt jelzi, hogy a Visual Studio hol szünetelteti a futó kódot, hogy megtekinthesse a változók értékeit, illetve a memória viselkedését, a kód futtatásának sorrendjét.

A Visual Studióban gyorsan beállíthat töréspontot a kódsor melletti bal margóra kattintva. Vagy helyezze a kurzort egy sorra, és nyomja le F9.

Ezeknek a fogalmaknak a szemléltetéséhez bemutatunk néhány példakódot, amely már több hibával rendelkezik. C#-ot használunk, de a hibakeresési funkciók a Visual Basic, a C++, a JavaScript, a Python és más támogatott nyelvekre is érvényesek. A Visual Basic mintakódja is elérhető, de a képernyőképek C#-ban találhatók.

Mintaalkalmazás létrehozása (néhány hibával)

Ezután létrehoz egy alkalmazást, amely néhány hibával rendelkezik.

  1. Telepítve kell lennie a Visual Studi-nak, és telepítve kell lennie a .NET asztali fejlesztési munkaterhelésnek.

    Ha még nem telepítette a Visual Studiót, lépjen a Visual Studio letöltési lapjára, és telepítse ingyenesen.

    Ha telepítenie kell a számítási feladatot, de már rendelkezik Visual Studióval, válassza az Eszközök>Eszközök és szolgáltatások lekéréselehetőséget. Elindul a Visual Studio Installer. Válassza a .NET asztali fejlesztési feladatot, majd válassza a Módosításlehetőséget.

  2. Nyissa meg a Visual Studiót.

    A kezdési ablakban válassza az Új projekt létrehozásalehetőséget. Írja be konzol a keresőmezőbe, válassza C# vagy Visual Basic nyelvként, majd válassza Konzolalkalmazás a .NET-hez. Válassza a Következőlehetőséget. Írja be a ConsoleApp_FirstApp a projekt neveként, és válassza a Következőlehetőséget.

    Ha másik projektnevet használ, módosítania kell a névtér értékét, hogy megfeleljen a projekt nevének a példakód másolásakor.

    Válassza ki az ajánlott cél keretrendszert vagy a .NET 8-at, majd válassza a Létrehozáslehetőséget.

    Ha nem látja a .NET-hez készült Konzolalkalmazás projektsablont, lépjen Eszközök>Eszközök és szolgáltatások lekéréseelemre, amely megnyitja a Visual Studio Installert. Válassza a .NET asztali fejlesztési feladatot, majd válassza a Módosításlehetőséget.

    A Visual Studio létrehozza a konzolprojektet, amely a jobb oldali panelen Megoldáskezelő jelenik meg.

  3. A Program.cs (vagy Program.vb) az összes alapértelmezett kódot cserélje le az alábbi kódra. (Először válassza ki a megfelelő nyelvlapot C# vagy Visual Basic nyelven.)

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp_FirstApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Welcome to Galaxy News!");
                IterateThroughList();
                Console.ReadKey();
            }
    
            private static void IterateThroughList()
            {
                var theGalaxies = new List<Galaxy>
            {
                new Galaxy() { Name="Tadpole", MegaLightYears=400, GalaxyType=new GType('S')},
                new Galaxy() { Name="Pinwheel", MegaLightYears=25, GalaxyType=new GType('S')},
                new Galaxy() { Name="Cartwheel", MegaLightYears=500, GalaxyType=new GType('L')},
                new Galaxy() { Name="Small Magellanic Cloud", MegaLightYears=.2, GalaxyType=new GType('I')},
                new Galaxy() { Name="Andromeda", MegaLightYears=3, GalaxyType=new GType('S')},
                new Galaxy() { Name="Maffei 1", MegaLightYears=11, GalaxyType=new GType('E')}
            };
    
                foreach (Galaxy theGalaxy in theGalaxies)
                {
                    Console.WriteLine(theGalaxy.Name + "  " + theGalaxy.MegaLightYears + ",  " + theGalaxy.GalaxyType);
                }
    
                // Expected Output:
                //  Tadpole  400,  Spiral
                //  Pinwheel  25,  Spiral
                //  Cartwheel, 500,  Lenticular
                //  Small Magellanic Cloud .2,  Irregular
                //  Andromeda  3,  Spiral
                //  Maffei 1,  11,  Elliptical
            }
        }
    
        public class Galaxy
        {
            public string Name { get; set; }
    
            public double MegaLightYears { get; set; }
            public object GalaxyType { get; set; }
    
        }
    
        public class GType
        {
            public GType(char type)
            {
                switch(type)
                {
                    case 'S':
                        MyGType = Type.Spiral;
                        break;
                    case 'E':
                        MyGType = Type.Elliptical;
                        break;
                    case 'l':
                        MyGType = Type.Irregular;
                        break;
                    case 'L':
                        MyGType = Type.Lenticular;
                        break;
                    default:
                        break;
                }
            }
            public object MyGType { get; set; }
            private enum Type { Spiral, Elliptical, Irregular, Lenticular}
        }
    }
    

    A kód célja az, hogy megjelenítse a galaxis nevét, a galaxis távolságát és a galaxis típusát egy listában. A hibakereséshez fontos tisztában lenni a kód szándékával. Íme a formátum, amelyet meg szeretnénk jeleníteni a kimenetben szereplő lista egy sorához:

    galaxisnév, távolság, galaxistípus.

Az alkalmazás futtatása

Nyomja le F5 vagy a Hibakeresés indítása gombot, a Hibakeresés indítása gombot megjelenítő ikont. a hibakeresési eszköztárban, amely a kódszerkesztő felett található.

Az alkalmazás elindul, és a hibakereső nem jelenít meg kivételeket. A konzolablakban látható kimenet azonban nem az elvárt. A várt kimenet a következő:

Tadpole  400,  Spiral
Pinwheel  25,  Spiral
Cartwheel, 500,  Lenticular
Small Magellanic Cloud .2,  Irregular
Andromeda  3,  Spiral
Maffei 1,  Elliptical

De ehelyett a következő kimenet jelenik meg:

Tadpole  400,  ConsoleApp_FirstApp.GType
Pinwheel  25,  ConsoleApp_FirstApp.GType
Cartwheel, 500,  ConsoleApp_FirstApp.GType
Small Magellanic Cloud .2,  ConsoleApp_FirstApp.GType
Andromeda  3,  ConsoleApp_FirstApp.GType
Maffei 1, 11,  ConsoleApp_FirstApp.GType

A kimenetet és a kódunkat tekintve tudjuk, hogy GType annak az osztálynak a neve, amely a galaxis típusát tárolja. A tényleges galaxistípust (például a "Spirál" típust) próbáljuk megjeleníteni, nem az osztály nevét!

Az alkalmazás hibakeresése

  1. Ha az alkalmazás továbbra is fut, szúrjon be egy töréspontot.

    A foreach hurokban kattintson a jobb gombbal a Console.WriteLine metódus mellett a helyi menü megnyitásához, és válassza a Töréspont>Töréspont beszúrása a kiugró menüből.

    foreach (Galaxy theGalaxy in theGalaxies)
    {
        Console.WriteLine(theGalaxy.Name + "  " + theGalaxy.MegaLightYears + ",  " + theGalaxy.GalaxyType);
    }
    

    A töréspont beállításakor piros pont jelenik meg a bal margón.

    Amint problémát lát a kimenetben, elkezdi a hibakeresést a hibakeresőben a kimenetet beállító előző kód megtekintésével.

  2. Válassza az Újraindításikont, amelyen a RestartApp gomb látható a Hibakeresés eszköztáron. gomb a hibakeresési eszköztáron (Ctrl + Shift + F5).

    Az alkalmazás a beállított törésponton szünetel. A sárga kiemelés jelzi, hogy a hibakereső hol van szüneteltetve (a sárga kódsor még nem lett végrehajtva).

  3. Vigye az egeret a jobb oldali GalaxyType változóra, majd bontsa ki theGalaxy.GalaxyTypea csavarkulcs ikontól balra. Láthatja, hogy GalaxyType tartalmaz egy tulajdonságot MyGType, és a tulajdonság értéke Spiral.

    Képernyőkép a Visual Studio Hibakeresőről egy sárga kódsorsal és a Galaxy GalaxyType tulajdonság alatt megnyitott menüvel.

    A "Spirál" valójában a megfelelő érték, amelyet a konzolra szeretne nyomtatni! Jó kezdet, hogy az alkalmazás futtatása közben hozzáférhet a kódban lévő értékhez. Ebben a forgatókönyvben helytelen API-t használunk. Nézzük meg, hogy ki tudja-e javítani ezt a hibát a hibakeresőben lévő kód futtatásakor.

  4. Ugyanebben a programkódban, mialatt hibát keres, helyezze a kurzort a theGalaxy.GalaxyType végére, és változtassa theGalaxy.GalaxyType.MyGType-re. Bár elvégezheti a szerkesztést, a kódszerkesztőben hiba jelenik meg (piros hullámos vonal). (A Visual Basicben a hiba nem jelenik meg, és a kód ezen szakasza működik.)

  5. Nyomja le a F11 billentyűt (Hibakeresés>Belépés vagy a hibakeresés eszköztárában a Belépés gomb) az aktuális kódsor végrehajtásához.

    F11 egy utasítással előrelépteti a hibakeresőt (és végrehajtja a kódot). F10 (Átlépés) egy hasonló parancs, és mindkettő hasznos a hibakereső használatának elsajátításához.

    Amikor megpróbálja tovább léptetni a hibakeresőt, megjelenik a Hot Reload párbeszédpanel, amely azt jelzi, hogy a módosítások nem fordíthatók.

    Képernyőkép a Visual Studio Hibakeresőről pirossal kiemelt kódsorsal és egy üzenetmezővel, amelyen a Szerkesztés lehetőség van kiválasztva.

    Megjelenik a Szerkesztés és folytatás párbeszédpanel, amely azt jelzi, hogy a módosításokat nem lehet lefordítani.

    Képernyőkép a Visual Studio Hibakeresőről pirossal kiemelt kódsorsal és egy üzenetmezővel, amelyen a Szerkesztés lehetőség van kiválasztva.

    Jegyzet

    A Visual Basic példakód hibakereséséhez hagyja ki a következő néhány lépést, amíg a rendszer nem utasítja, hogy kattintson az Újraindításikonra, amelyen az Alkalmazás újraindítása gomb látható a Hibakeresés eszköztáron. gomb.

  6. Válassza a Szerkesztés lehetőséget a Gyors újratöltés vagy Szerkesztés és folytatás üzenetdobozban. Most megjelenik egy hibaüzenet a Hibalista ablakban. A hiba azt jelzi, hogy a 'object' nem tartalmaz egy definíciót a MyGType-hez.

    Visual Studio hibakeresőjének képernyőképe, amelyen pirossal kiemelt kódsor és egy hibalista ablak látható, amelyen két hiba látható.

    Annak ellenére, hogy minden galaxist GType típusú objektummal állítunk be (amely rendelkezik a MyGType tulajdonsággal), a hibakereső nem ismeri fel a theGalaxy objektumot GTypetípusú objektumként. Mi történik? Minden olyan kódot át szeretne nézni, amely beállítja a galaxis típusát. Ha ezt teszi, láthatja, hogy a GType osztálynak biztosan van MyGTypetulajdonsága, de valami nem helyes. A object kapcsolatos hibaüzenetről kiderül, hogy ez a nyom; a nyelvi értelmező számára a típus object típusú objektumnak tűnik a GTypetípusú objektum helyett.

  7. A galaxis típusának beállításához kapcsolódó kódban azt találja, hogy a GalaxyType osztály Galaxy tulajdonsága object van megadva GTypehelyett.

    public object GalaxyType { get; set; }
    
  8. Módosítsa az előző kódot az alábbiak szerint:

    public GType GalaxyType { get; set; }
    
  9. Válassza az Újraindításikont, amelyen az Alkalmazás újraindítása gomb látható a Hibakeresés eszköztáron. hibakeresési eszköztár (Ctrl + Shift + F5) gombja a kód újrafordításához és újraindításához.

    Most, amikor a hibakereső megáll a Console.WriteLinesoron, fölé viheti az egeret a theGalaxy.GalaxyType.MyGType-re, és láthatja, hogy az érték megfelelően van beállítva.

  10. Távolítsa el a töréspontot a bal margón lévő töréspontkörre kattintva (vagy kattintson a jobb gombbal, és válassza Töréspont>Töréspont törlése), majd a folytatáshoz nyomja le F5.

    Az alkalmazás fut, és megjeleníti a kimenetet. Jól néz ki, de egy dolgot észrevesz. Azt várta, hogy a Kis Magellán-felhő galaxis szabálytalan galaxisként jelenik meg a konzol kimenetében, de nem mutat semmilyen galaxistípust.

    Tadpole  400,  Spiral
    Pinwheel  25,  Spiral
    Cartwheel, 500,  Lenticular
    Small Magellanic Cloud .2,
    Andromeda  3,  Spiral
    Maffei 1,  Elliptical
    
  11. Állítson be töréspontot ezen a kódsoron a switch utasítás előtt (a Visual Basic Select utasítása előtt).

    public GType(char type)
    

    Ebben a kódban van beállítva a galaxis típusa, ezért szeretnénk közelebbről megvizsgálni.

  12. Válassza az Újraindításikont, amelyen az Alkalmazás újraindítása gomb látható a Hibakeresés eszköztáron. gomb a hibakeresési eszköztáron (Ctrl + Shift + F5) az újraindításhoz.

    A hibakereső a kód azon sorában áll meg, ahol beállítja a töréspontot.

  13. Mutasson a type változóra. Az S értéket látja (a karakterkód alapján). Érdekli a Iértéke, mivel tudja, hogy ez egy szabálytalan galaxistípus.

  14. Nyomja le F5, és vigye ismét az egérmutatót a type változó fölé. Ismételje meg ezt a lépést, amíg meg nem jelenik egy I érték a type változóban.

    A Visual Studio Hibakeresőjének képernyőképe sárga kódsorsal és egy 73 I. típusú változó értékkel rendelkező ablakkal

  15. Most nyomja meg F11 (Hibakeresés>Belelépés).

  16. Nyomja le a F11 billentyűket, amíg meg nem áll a switch kódsoron az "I" értékhez (Select sor a Visual Basic esetén). Itt egy elírásból eredő egyértelmű probléma jelenik meg. Azt várta, hogy a kód arra a helyre lépjen, ahol a MyGType-t szabálytalan galaxistípusként állítja be, de a hibakereső ehelyett teljesen kihagyja ezt a kódrészt, és a default utasítás switch szakaszában szünetel (ami a Visual Basic-ben aElse utasítás).

    Elírási hibát ábrázoló képernyőkép.

    A kódot tekintve egy elírás jelenik meg a case 'l' utasításban. Ennek meg kell lennie case 'I'.

  17. Válassza ki a case 'l' kódot, és cserélje le case 'I'-re.

  18. Távolítsa el a töréspontot, majd válassza a Újraindítás gombot az alkalmazás újraindításához.

    A hibák már ki lettek javítva, és megjelenik a várt kimenet!

    Az alkalmazás befejezéséhez nyomja le bármelyik billentyűt.

Összefoglalás

Ha problémát tapasztal, használja a hibakeresőt és lépésparancsokat, például F10 és F11 a kód régiójának megkereséséhez.

Jegyzet

Ha nehéz azonosítani a kódnak azt a régióját, ahol a probléma előfordul, állítson be egy töréspontot a probléma előtt futó kódban, majd használja a lépésparancsokat, amíg meg nem jelenik a problémajegyzék. A nyomkövetési pontok segítségével is naplózhatja az üzeneteket a Kimeneti ablakba. A naplózott üzeneteket (és a még nem naplózott üzeneteket figyelve!) gyakran elkülönítheti a kód régióját a problémával. Előfordulhat, hogy többször is meg kell ismételnie ezt a folyamatot a szűkítéséhez.

Ha megtalálta a problémát tartalmazó kódterületet, a hibakeresővel vizsgálja meg. A probléma okának megkereséséhez vizsgálja meg a hibakódot, miközben az alkalmazást futtatja a hibakeresőben:

  • Vizsgálja meg a változókat, és ellenőrizze, hogy tartalmazzák-e azoknak az értékeknek a típusát, amelyeket tartalmaznia kell. Ha rossz értéket talál, állapítsa meg, hogy hol lett beállítva a hibás érték (az érték beállításának helyének megtalálásához esetleg újra kell indítania a hibakeresőt, meg kell néznie a hívási vermetvagy mindkettőt).

  • Ellenőrizze, hogy az alkalmazás végrehajtja-e a várt kódot. (A mintaalkalmazásban például arra számítottunk, hogy a switch utasítás kódja szabálytalanra állítja a galaxis típusát, de az alkalmazás a elírás miatt kihagyta a kódot.)

Borravaló

Egy hibakeresőt használsz, hogy segítsen megtalálni a hibákat. A hibakereső eszköz csak akkor talál hibákat számodra, ha ismeri a kódod célját. Az eszköz csak akkor tudja ismerni a kód szándékát, ha Ön, a fejlesztő kifejezi ezt a szándékot. Az egységtesztek írása az, ahogyan ezt megvalósíthatod.

Következő lépések

Ebben a cikkben megismert néhány általános hibakeresési fogalmat. Ezután elkezdhet többet megtudni a hibakeresőről.