Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
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.
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.
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.
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é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
Ha az alkalmazás továbbra is fut, szúrjon be egy töréspontot.
A
foreachhurokban kattintson a jobb gombbal aConsole.WriteLinemetó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.
Válassza az Újraindítás
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).
Vigye az egeret a jobb oldali
GalaxyTypeváltozóra, majd bontsa kitheGalaxy.GalaxyTypea csavarkulcs ikontól balra. Láthatja, hogyGalaxyTypetartalmaz egy tulajdonságotMyGType, és a tulajdonság értékeSpiral.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.
Ugyanebben a programkódban, mialatt hibát keres, helyezze a kurzort a
theGalaxy.GalaxyTypevégére, és változtassatheGalaxy.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.)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.
Megjelenik a Szerkesztés és folytatás párbeszédpanel, amely azt jelzi, hogy a módosításokat nem lehet lefordítani.
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ás
gomb.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 aMyGType-hez.Annak ellenére, hogy minden galaxist
GTypetípusú objektummal állítunk be (amely rendelkezik aMyGTypetulajdonsággal), a hibakereső nem ismeri fel atheGalaxyobjektumotGTypetí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 aGTypeosztálynak biztosan vanMyGTypetulajdonsága, de valami nem helyes. Aobjectkapcsolatos hibaüzenetről kiderül, hogy ez a nyom; a nyelvi értelmező számára a típusobjecttípusú objektumnak tűnik aGTypetípusú objektum helyett.A galaxis típusának beállításához kapcsolódó kódban azt találja, hogy a
GalaxyTypeosztályGalaxytulajdonságaobjectvan megadvaGTypehelyett.public object GalaxyType { get; set; }Módosítsa az előző kódot az alábbiak szerint:
public GType GalaxyType { get; set; }Válassza az Újraindítás
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 atheGalaxy.GalaxyType.MyGType-re, és láthatja, hogy az érték megfelelően van beállítva.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Állítson be töréspontot ezen a kódsoron a
switchutasítás előtt (a Visual BasicSelectutasí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.
Válassza az Újraindítás
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.
Mutasson a
typeváltozóra. AzSértéket látja (a karakterkód alapján). Érdekli aIértéke, mivel tudja, hogy ez egy szabálytalan galaxistípus.Nyomja le F5, és vigye ismét az egérmutatót a
typeváltozó fölé. Ismételje meg ezt a lépést, amíg meg nem jelenik egyIérték atypeváltozóban.
típusú változó értékkel rendelkező ablakkal
Most nyomja meg F11 (Hibakeresés>Belelépés).
Nyomja le a F11 billentyűket, amíg meg nem áll a
switchkódsoron az "I" értékhez (Selectsor 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 aMyGType-t szabálytalan galaxistípusként állítja be, de a hibakereső ehelyett teljesen kihagyja ezt a kódrészt, és adefaultutasításswitchszakaszában szünetel (ami a Visual Basic-ben aElseutasítás).
A kódot tekintve egy elírás jelenik meg a
case 'l'utasításban. Ennek meg kell lenniecase 'I'.Válassza ki a
case 'l'kódot, és cserélje lecase 'I'-re.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
switchutasí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.