Programiranje

Odpravljanje napak z jdb

V: Kako učinkovito uporabljate jdb (vključen v paket JDK 1.2) za razhroščevanje programov Java?

Velikokrat sem že poskusil, vendar sem uspešen le pri nalaganju datoteke razreda v jdb; Ne morem ga odpraviti. The pomoč ukaz ni veliko uporaben.

A: Zastaviš zanimivo vprašanje. Če sem iskren, sem nikoli uporablja jdb. Vedno sem uporabljal razhroščevalnik, ki ga nudi moje okolje IDE. Da bi odgovoril na vaše vprašanje, sem moral malo raziskovati.

Izkazalo se je, da razmišlja Sun jdb dokaz koncepta za API za razhroščevanje Java. API za razhroščevanje Java nam omogoča, da dejansko pokukamo v izvajanje in odpravimo napake v naši kodi. The jdb je le ena izvedba razhroščevalnika, ki uporablja API. V primerjavi z vizualnimi razhroščevalniki, s katerimi sem seznanjen (da, mislim, da sem wimp), ni najlažji razhroščevalnik za uporabo - čeprav je podoben drugim razhroščevalnikom ukazne vrstice, kot je npr. gdb.

Kakorkoli že, na vaše vprašanje. Preden poskusite odpraviti napake v svoji kodi, obvezno uporabite -g med sestavljanjem predavanj. Ta možnost prevajalniku sporoči, da v datoteko predavanja vključi informacije o odpravljanju napak.

Določimo izmišljeni razred za testiranje:

javni razred TestMe {private int int_value; zasebni niz string_value; javna statična void main (String [] args) {TestMe testMe = new TestMe (); testMe.setInt_value (1); testMe.setString_value ("test"); int celo število = testMe.getInt_value (); Niz niza = testMe.getString_value (); String toString = testMe.toString (); } public TestMe () {} public int getInt_value () {return int_value; } javni String getString_value () {vrne string_value; } javna void setInt_value (int vrednost) {int_value = vrednost; } javna praznina setString_value (vrednost niza) {string_value = vrednost; } javni String toString () {return "Vrednost niza:" + string_value + "int vrednost:" + int_value; }} 

Zaženi razhroščevalnik:

> jdb TestMe 

Morali bi videti:

> Inicializacija jdb ...> 0xaa: razred 

Oglejmo si nekaj osnovnih ukazov. Da bi nastavili prekinitvene točke, moramo poznati številke vrstic ali imena metod krajev, kjer bi radi lomili. Če želite dobiti seznam metod, preprosto uporabite metode ukaz:

> metode 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 ( ) 

Nastavitev mejne vrednosti je preprosta. Uporabite naslednjo skladnjo:

ustavi se. [] 

Ali:

ustavite se na: 

Odpravljanje napak bi morali začeti na začetku glavne metode:

> ustavi v TestMe.main Breakpoint, nastavljen v javaworld.TestMe.main 

Zdaj, ko imamo prelomno točko, lahko začnemo z izvajanjem. Če želite priti do točke preloma, preprosto uporabite teči ukaz:

> zaženi zaženi javaworld.TestMe teče ... glavni [1] Zadetek točke preloma: javaworld.TestMe.main (TestMe: 10) 

V tem trenutku razhroščevalnik ustavi izvajanje v prvi vrstici glavne metode. Upoštevajte, da se je kazalec spremenil, da odraža metodo, v kateri smo trenutno.

The seznam ukaz bo prikazal kodo na točki preloma. Puščica označuje mesto, kjer je razhroščevalnik zaustavil izvajanje.

glavni [1] seznam 6 zasebni niz string_value; 7 8 javna statična void main (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int celo število = testMe.getInt_value (); glavni [1] 

Nato bomo želeli korak skozi nekaj vrstic kode in poglejte, kaj se je spremenilo:

glavni [1] korak glavni [1] Zadetek točke preloma: javaworld.TestMe. (TestMe: 20) main [1] domačini Argumenti metode: Lokalne spremenljivke: this = vrednost niza: ničelna vrednost int: 0 glavni [1] seznam 16 17 String toString = testMe.toString (); 18} 19 20 => public TestMe () 21 {22} 23 24 public int getInt_value () glavni [1] korak glavni [1] Zadetek točke preloma: java.lang.Object. (Objekt: 27) glavni [1] seznam Ni mogoče najti Object.java glavni [1] korak glavni [1] Zadetek točke preloma: javaworld.TestMe. (TestMe: 22) glavni [1] seznam 18} 19 20 javni TestMe () 21 {22 =>} 23 24 public int getInt_value () 25 {26 return int_value; glavni [1] korak glavni [1] Zadevna točka: javaworld.TestMe.main (TestMe: 10) main [1] seznam 6 zasebni niz string_value; 7 8 javna statična void main (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int celo število = testMe.getInt_value (); glavni [1] korak glavni [1] Zadevna točka: javaworld.TestMe.main (TestMe: 11) main [1] seznam 7 8 javna statična void main (String [] args) 9 {10 TestMe testMe = new TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int celo število = testMe.getInt_value (); 15 niz niza = testMe.getString_value (); glavni [1] domačini Argumenti metode: Lokalne spremenljivke: args = testMe = Vrednost niza: nična vrednost int: 0 

Po vsakem korak, Sem poklical seznam ukaz, da vidim, kje sem bil v kodi. V povratni vrednosti iz ukaza je bila navedena številka vrstice, vendar mi to nekako ni pomagalo.

Kot mi korak, vidimo, da je glavna metoda izdelava a TestMe primer. Vsak korak nas popelje skozi konstruktor in končno nazaj v glavno metodo. The domačini ukaz navaja vse lokalne spremenljivke, vidne v trenutnem kupu. Vidimo, da sta na tej točki glavne metode le dve lokalni spremenljivki: argume in testMe.

Z uporabo korak, lahko vstopimo v katero koli metodo, da vidimo, kaj se dogaja. Ko kombiniramo korak z domačini ukaz lahko vidimo naše spremenljivke:

glavni [1] korak glavni [1] Zadevna točka: javaworld.TestMe.setInt_value (TestMe: 36) main [1] seznam 32} 33 34 javna praznina setInt_value (int vrednost) 35 {36 => int_value = vrednost; 37} 38 39 javna void setString_value (vrednost niza) 40 {main [1] domačini Argumenti metode: Lokalne spremenljivke: vrednost = 1 to = vrednost niza: nična vrednost int: 0 

Če bomo korak še enkrat končamo v setInt_value () metoda. Če bomo korak še dvakrat bo metoda nastavila int_value član do 1 in se vrnite. (Če želite preveriti, ali je metoda nastavila vrednost, uporabite domačini ukaz.)

Seveda, ko bomo korak, ne bomo vedno želeli slediti vsaki metodi, s katero se srečamo. Nekateri klici metode lahko gnezdijo zelo globoko. Če bi bili prisiljeni slediti celotni hierarhiji, morda nikoli ne bi končali. Na srečo, jdb ima način za izvedbo metode brez sledenje tej metodi: Naslednji ukaz.

jdb ponuja tudi nekaj drugih korak ukazi. The stepi ukaz izvrši trenutno navodilo. Z drugimi besedami, koda na => bo izvedla, vendar trenutna vrstica ne bo napredovala do naslednjega navodila. Lahko pokličete stepi milijonkrat, toda => prikazano iz seznam ukaz se ne premakne.

jdb ponuja tudi stopi gor ukaz. The stopi gor klic se izvaja, dokler se trenutna metoda ne vrne klicatelju. Preprosto povedano, ta stepper izvaja metodo in nič drugega. Za primer vzemimo naslednji segment kode:

int celo število = testMe.getInt_value (); 

Če je to naša trenutna vrstica in tečemo stopi gor, getInt_value () metoda se bo izvedla. Vendar to bo vse, kar se bo zgodilo. Vrnjena vrednost ne bo nastavljena na celo število.

jdb omogoča tudi nastavitev več mejnih točk. Če želite iti z ene točke preloma neposredno na drugo, jdb zagotavlja nadaljevanje ukaz.

Nazadnje, včasih si želimo ogledati vse člane primerka ali razreda. Na srečo, jdb zagotavlja smetišče in natisni ukazi:

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 = Vrednost niza: test int vrednost: 1 

Ko tečeš smetišče ali natisni v razredu dobite informacije o razredu, ki vključujejo informacije o superrazredu in nakladalniku. Ko tečeš smetišče in natisni na primerku dobite informacije o primerku, na primer člane podatkov in njihove trenutne vrednosti.

jdb ponuja tudi ukaze za spuščanje in umazanijo v nitih in skladih. Vendar ti ukazi resnično presegajo področje uporabe a jdb uvod.

Še zadnja točka: lahko se vprašate: "Kako učinkovito uporabljate jdb? "Učinkovitost uporabe bo odvisna od vaše ravni udobja z jdb. Ko prvič uporabite jdb, najpomembnejši ukaz je pomoč. The pomoč ukaz vsebuje vsak ukaz in vsebuje nekaj osnovnih informacij, ki vam bodo pomagale začeti. Ko enkrat pomoč ukaz obvladan, boste uporabili ukaze, ki skupaj z korak in seznam. Vsaka kombinacija teh ukazov vam bo omogočila začetek uporabe jdb. korak, seznam, korak, seznam... naj vam pomaga hitro najti kodo, ki vas bombardira.

Preberite več o tej temi

  • "Razhroščevanje jezikov Java" s spletnega mesta Postech ME

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

  • "jdbRazhroščevalec Java, "od Reference za razvijalce Java, Mike Cohen, et al. (Založba Sams.net, 1996)

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

To zgodbo "Odpravljanje napak z jdb" je prvotno objavil JavaWorld.

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