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 jdb
Naudojimo 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“.