Programavimas

Derinti su jdb

Klausimas: Kaip efektyviai naudoti jdb (įtrauktas į JDK 1.2 paketą) derinant „Java“ programas?

Bandžiau daug kartų, bet man pavyko įkelti tik klasės failą į jdb; Aš negaliu jo derinti. pagalba komanda nėra labai naudinga.

A: Užduodate įdomų klausimą. Jei atvirai, aš taip niekada naudojamas jdb. Visada naudojau savo IDE aplinkos derintuvą. Taigi, norėdamas atsakyti į jūsų klausimą, turėjau atlikti savo tyrimą.

Pasirodo, kad Saulė svarsto jdb „Java Debugger“ API koncepcijos įrodymas. „Java Debugger“ API leidžia mums iš tikrųjų žvilgtelėti į vykdymo laiką ir derinti mūsų kodą. jdb yra tik vienas derintuvo, naudojančio API, diegimas. Palyginti su man žinomais vizualiais derintuvais (taip, manau, kad esu menkas), tai nėra paprasčiausias derintuvas, nors jis panašus į kitus komandų eilutės derintuvus, pvz., gdb.

Šiaip ar taip, į jūsų klausimą. Prieš bandydami derinti kodą, būtinai naudokite -g rinkdami savo klases. Ši parinktis liepia kompiliatoriui įtraukti derinimo informaciją į savo klasės failą.

Apibrėžkime sugalvotą testavimui klasę:

viešoji klasė TestMe {private int int_value; privati ​​eilutė string_value; public static void main (String [] args) {TestMe testMe = naujas TestMe (); testMe.setInt_value (1); testMe.setString_value ("testas"); int sveikasis skaičius = testMe.getInt_value (); Eilučių eilutė = testMe.getString_value (); String toString = testMe.toString (); } public TestMe () {} public int getInt_value () {return int_value; } public String getString_value () {return string_value; } public void setInt_value (int reikšmė) {int_value = reikšmė; } public void setString_value (String value) {string_value = value; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Paleiskite derintuvą:

> jdb TestMe 

Turėtumėte pamatyti:

> Inicijuojamas jdb ...> 0xaa: klasė 

Pažvelkime į keletą pagrindinių komandų. Norint nustatyti lūžio taškus, turime žinoti vietų, kuriose norėtume sulaužyti, linijų numerius arba metodų pavadinimus. Norėdami gauti metodų sąrašą, tiesiog naudokite metodai komanda:

> metodai TestMe void main (java.lang.String []) void () int getInt_value () java.lang.String getString_value () void setInt_value (int) void setString_value (java.lang.String) java.lang.String toString ( ) 

Nustatyti lūžio tašką yra paprasta. Naudokite šią sintaksę:

sustoti. [] 

Arba:

sustoti: 

Derinimą turėtume pradėti nuo pagrindinio metodo pradžios:

> sustabdyti „TestMe.main“ lūžio tašką, nustatytą „javaworld.TestMe.main“ 

Dabar, kai turime lūžio tašką, galime pradėti vykdyti. Norėdami pasiekti ribą, tiesiog naudokite paleisti komanda:

> paleisti paleisti javaworld.TestMe veikia ... main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 10) 

Šiuo metu derintojas sustabdo vykdymą pirmoje pagrindinio metodo eilutėje. Atkreipkite dėmesį, kad žymeklis pasikeitė, kad atspindėtų šiuo metu naudojamą metodą.

sąrašą komanda parodys kodą pertraukos taške. Rodyklė nurodo vietą, kurioje derintojas sustabdė vykdymą.

pagrindinis [1] sąrašas 6 asmeninės eilutės eilutės_ vertė; 7 8 public static void main (String [] argumentai) 9 {10 => TestMe testMe = naujas TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value („testas“); 13 14 int sveikasis skaičius = testMe.getInt_value (); pagrindinis [1] 

Toliau mes norėsime žingsnis per kelias kodo eilutes ir sužinokite, kas pasikeitė:

main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 20) main [1] locals Metodo argumentai: Vietiniai kintamieji: this = String value: null int value: 0 main [1] list 16 17 String toString = testMe.toString (); 18} 19 20 => public TestMe () 21 {22} 23 24 public int getInt_value () main [1] step main [1] Breakpoint hit: java.lang.Object. (Object: 27) main [1] list Nepavyko rasti Object.java main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 22) pagrindinis [1] sąrašas 18} 19 20 viešasis TestMe () 21 {22 =>} 23 24 public int getInt_value () 25 {26 return int_value; main [1] step main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 10) main [1] list 6 private String string_value; 7 8 public static void main (String [] argumentai) 9 {10 => TestMe testMe = naujas TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value („testas“); 13 14 int sveikasis skaičius = testMe.getInt_value (); main [1] step main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 11) main [1] list 7 8 public static void main (String [] args) 9 {10 TestMe testMe = new TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value („testas“); 13 14 int sveikasis skaičius = testMe.getInt_value (); 15 eilutės eilutė = testMe.getString_value (); main [1] locals Metodo argumentai: Vietiniai kintamieji: args = testMe = Stygos reikšmė: null int reikšmė: 0 

Po kiekvieno žingsnis, Paskambinau sąrašą komanda pamatyti, kur aš buvau kode. Komandos grąžinimo reikšmėje buvo nurodytas eilutės numeris, bet kažkaip tai man nelabai padėjo.

Kaip mes žingsnis, matome, kad pagrindinis metodas yra a konstravimas TestMe instancija. Kiekvienas žingsnis veda mus per konstruktorių ir galiausiai grįžta į pagrindinį metodą. vietiniai gyventojai komanda pateikia visus vietinius kintamuosius, matomus dabartiniame šūsnyje. Matome, kad šiame pagrindinio metodo taške yra tik du vietiniai kintamieji: argumentuoja ir testMe.

Naudojant žingsnis, galime patekti į bet kurį iš metodų, kad pamatytume, kas vyksta. Kai sujungsime žingsnis su vietiniai gyventojai komanda galime pamatyti mūsų kintamuosius:

main [1] step main [1] Breakpoint hit: javaworld.TestMe.setInt_value (TestMe: 36) main [1] list 32} 33 34 public void setInt_value (int value) 35 {36 => int_value = value; 37} 38 39 public void setString_value (String value) 40 {main [1] locals Metodo argumentai: Vietiniai kintamieji: value = 1 this = String value: null int value: 0 

Jei mes žingsnis dar kartą mes atsiduriame setInt_value () metodas. Jei mes žingsnis dar du kartus, metodas nustatys int_value narys į 1 ir grįžti. (Norėdami patikrinti, ar metodas nustato vertę, naudokite vietiniai gyventojai komandą.)

Žinoma, kai mes žingsnis, ne visada norėsime atsekti kiekvieną metodą, su kuriuo susiduriame. Kai kurie metodo skambučiai gali būti labai gilūs. Jei būtume priversti atsekti visą hierarchiją, galbūt niekada ir nebaigsime. Laimei, jdb turi būdą atlikti metodą be susekti į tą metodą: Kitas komandą.

jdb taip pat pateikia keletą kitų žingsnis komandos. stepi komanda vykdo dabartinę instrukciją. Kitaip tariant, kodas prie => bus vykdoma, bet dabartinė eilutė nebus pereita prie kitos instrukcijos. Tu gali paskambinti stepi milijoną kartų, bet => rodomas iš sąrašą komanda nepajudės.

jdb taip pat teikia sustiprinti komandą. sustiprinti skambutis vykdomas tol, kol dabartinis metodas grįš į skambinantįjį. Paprasčiau tariant, šis žingsnis vykdo metodą ir nieko kito. Kaip pavyzdį paimkite šį kodo segmentą:

int sveikasis skaičius = testMe.getInt_value (); 

Jei tai yra dabartinė mūsų linija ir mes bėgame sustiprinti, getInt_value () metodas bus vykdomas. Tačiau viskas ir įvyks. Grąžinimo vertė nebus nustatyta sveikasis skaičius.

jdb taip pat leidžia mums nustatyti kelis lūžio taškus. Norėdami pereiti nuo vieno lūžio taško tiesiai prie kito, jdb teikia tęsinys komandą.

Galiausiai yra atvejų, kai norime pažvelgti į visus egzemplioriaus ar klasės narius. Laimei, jdb teikia išpilti ir spausdinti komandos:

main [1] dump TestMe TestMe = 0xa9: class (javaworld.TestMe) {superclass = 0x2: class (java.lang.Object) loader = (sun.misc.Launcher $ AppClassLoader) 0xaa} main [1] print TestMe TestMe = 0xa9: class (javaworld.TestMe) main [1] dump testMe testMe = (javaworld.TestMe) 0xec {private java.lang.String string_value = test private int int_value = 1} main [1] print testMe testMe = Stygos reikšmė: testas int vertė: 1 

Kai bėgsi išpilti arba spausdinti klasėje gausite informaciją apie klasę, įskaitant informaciją apie superklasę ir krautuvą. Kai bėgsi išpilti ir spausdinti egzemplioriuje gausite informaciją apie egzempliorių, pvz., duomenų narius ir jų dabartines reikšmes.

jdb taip pat pateikia komandas, kaip nusileisti ir susitepti siūlus ir kaminus. Tačiau šios komandos tikrai nėra a jdb įvadas.

Paskutinis dalykas: galite paklausti: „Kaip efektyviai naudotis jdbNaudojimo efektyvumas priklausys nuo jūsų komforto lygio jdb. Kai pirmą kartą naudojate jdb, svarbiausia komanda yra pagalba. pagalba komanda pateikia kiekvieną komandą ir pateikia tam tikrą pagrindinę informaciją, kuri padės jums pradėti. Kai turėsite pagalba komanda įsisavinsite, naudosite komandas, nustatančias pertraukimo taškus kartu su žingsnis ir sąrašą. Bet koks šių komandų derinys leis jums pradėti naudotis jdb. žingsnis, sąrašą, žingsnis, sąrašą... turėtų padėti greitai rasti kodą, kuris jus bombarduoja.

Sužinokite daugiau apie šią temą

  • „Java“ kalbos derinimas “iš„ Postech ME “svetainės

    //mech.postech.ac.kr/Java/java.sun.com/products/JDK/debugging/

  • "jdb„Java“ derintuvas "iš „Java“ kūrėjo nuoroda, Mike'as Cohenas ir kt. („Sams.net Publishing“, 1996)

    //docs.online.bg/PROGRAMMING/JAVA_Developers_Reference/ch15.htm

Šią istoriją „Derinti su jdb“ iš pradžių paskelbė „JavaWorld“.

$config[zx-auto] not found$config[zx-overlay] not found