Ohjelmointi

Virheenkorjaus jdb: n kanssa

K: Kuinka käytät jdb: tä (sisältyy JDK 1.2 -pakettiin) tehokkaasti Java-ohjelmien virheenkorjaukseen?

Olen kokeillut useita kertoja, mutta onnistun vain lataamaan luokkatiedoston kohteeseen jdb; En voi korjata sitä. auta komento ei ole paljon käyttöä.

A: Esität mielenkiintoisen kysymyksen. Ollakseni rehellinen, olen ei koskaan käytetty jdb. Olen aina käyttänyt IDE-ympäristöni tarjoamaa virheenkorjainta. Joten vastaamaan kysymykseeni minun piti tehdä pieni oma tutkimus.

On käynyt ilmi, että Sun harkitsee jdb todiste Java Debugger -sovellusliittymän käsitteestä. Java Debugger -sovellusliittymän avulla voimme todella kurkistaa ajonaikaan ja virittää koodin. jdb on vain yksi sovellusliittymää käyttävän virheenkorjaimen toteutus. Verrattuna tuntemiini visuaalisiin virheenkorjauksiin (kyllä, luulen, että olen wimp), se ei ole helpoin virheenkorjausohjelma - vaikka se on samanlainen kuin muut komentorivin virheenkorjaajat, kuten gdb.

Joka tapauksessa, kysymykseesi. Varmista ennen koodin virheenkorjausta, että käytät -g -vaihtoehto luokkia koottaessa. Tämä vaihtoehto kertoo kääntäjän sisällyttämään virheenkorjaustiedot luokkatiedostoosi.

Määritetään keksitty luokka testausta varten:

julkinen luokka TestMe {private int int_value; yksityinen merkkijono merkkijonoarvo; public static void main (Merkkijono [] argumentit) {TestMe testMe = uusi TestMe (); testMe.setInt_value (1); testMe.setString_value ("testi"); int kokonaisluku = testMe.getInt_value (); Merkkijono = testMe.getString_value (); Merkkijono toString = testMe.toString (); } public TestMe () {} public int getInt_value () {return int_value; } public String getString_value () {return string_value; } public void setInt_value (int arvo) {int_value = arvo; } public void setString_value (Merkkijonoarvo) {string_value = arvo; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Käynnistä virheenkorjaus:

> jdb TestMe 

Sinun pitäisi nähdä:

> Alustetaan jdb ...> 0xaa: luokka 

Katsotaanpa joitain peruskomentoja. Katkaisupisteiden asettamiseksi meidän on tiedettävä niiden viivojen numerot tai menetelmien nimet, joissa haluaisimme rikkoa. Saat luettelon menetelmistä yksinkertaisesti käyttämällä menetelmiä komento:

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

Raja-arvon asettaminen on helppoa. Käytä seuraavaa syntaksia:

pysähdy sisään. 

Tai:

pysähdy: 

Meidän pitäisi aloittaa virheenkorjaus päämenetelmän alusta:

> pysäytys TestMe.main-murtopisteessä, joka on asetettu javaworld.TestMe.main-sovelluksessa 

Nyt kun meillä on katkaisupiste, voimme aloittaa suorituksen. Käytä juoksupainiketta, jotta saavutat raja-arvon juosta komento:

> ajaa ajaa javaworld.TestMe käynnissä ... main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 10) 

Tässä vaiheessa virheenkorjaus keskeyttää suorituksen päämenetelmän ensimmäisellä rivillä. Huomaa, että kohdistin on muuttunut vastaamaan nykyistä menetelmää.

lista -komento näyttää koodin rikkoutumispisteessä. Nuoli osoittaa pisteen, jossa virheenkorjaaja on pysäyttänyt suorituksen.

Main [1] list 6 private String string_value; 7 8 julkinen staattinen tyhjä pää (merkkijono [] argumentit) 9 {10 => TestMe testMe = uusi TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("testi"); 13 14 int kokonaisluku = testMe.getInt_value (); pää [1] 

Seuraavaksi haluamme askel läpi muutaman rivin koodia ja katso, mitä on muuttunut:

main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 20) main [1] paikalliset Menetelmäargumentit: Paikalliset muuttujat: this = Merkkijonon arvo: null int -arvo: 0 main [1] -luettelo 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 Ei löydy Object.java main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 22) pää [1] luettelo 18} 19 20 julkinen TestMe () 21 {22 =>} 23 24 julkinen 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 julkinen staattinen tyhjä pää (merkkijono [] argumentit) 9 {10 => TestMe testMe = uusi TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("testi"); 13 14 int kokonaisluku = 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 [] argumentit) 9 {10 TestMe testMe = uusi TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value ("testi"); 13 14 int kokonaisluku = testMe.getInt_value (); 15 Merkkijono = testMe.getString_value (); main [1] paikalliset Menetelmäargumentit: Paikalliset muuttujat: args = testMe = Merkkijonoarvo: null int-arvo: 0 

Jokaisen jälkeen askel, Soitin lista komento nähdäksesi missä olin koodissa. Komennon palautusarvo listasi rivinumeron, mutta jotenkin se ei oikeastaan ​​auttanut minua kovin paljon.

Kuten me askel, näemme, että päämenetelmä on a: n rakentaminen Testaa minua ilmentymä. Jokainen vaihe vie meidät rakentajan läpi ja lopulta takaisin päämenetelmään. paikalliset -komento listaa kaikki nykyisessä pinossa näkyvät paikalliset muuttujat. Näemme, että päämenetelmän tässä vaiheessa on vain kaksi paikallista muuttujaa: väittää ja testaa minua.

Käyttämällä askel, voimme päästä mihin tahansa menetelmään nähdäksesi, mitä tapahtuu. Kun yhdistämme askel kanssa paikalliset komento voimme nähdä muuttujamme:

main [1] step main [1] Breakpoint hit: javaworld.TestMe.setInt_value (TestMe: 36) main [1] list 32} 33 34 public void setInt_value (int arvo) 35 {36 => int_value = arvo; 37} 38 39 public void setString_value (Merkkijonoarvo) 40 {main [1] paikalliset Menetelmäargumentit: Paikalliset muuttujat: arvo = 1 tämä = Merkkijonoarvo: null int-arvo: 0 

Jos me askel vielä kerran päätymme setInt_value () menetelmä. Jos me askel vielä kaksi kertaa, menetelmä asettaa int_arvo jäsen 1 ja palata. (Voit tarkistaa, että menetelmä asettaa arvon, käyttämällä paikalliset komento.)

Tietenkin, kun me askel, emme aina halua jäljittää kutakin tapaamamme menetelmää. Jotkut menetelmäpuhelut voivat olla pesässä hyvin syvälle. Jos meidät pakotetaan seuraamaan läpi koko hierarkian, emme ehkä koskaan pääse loppuun. Onneksi, jdb on tapa suorittaa menetelmä ilman jäljittäminen tähän menetelmään: Seuraava komento.

jdb tarjoaa myös muutamia muita askel komentoja. stepi komento suorittaa nykyisen käskyn. Toisin sanoen koodi => suoritetaan, mutta nykyinen rivi ei siirry seuraavaan ohjeeseen. Voit soittaa stepi miljoona kertaa, mutta => näytetään lista komento ei liiku.

jdb tarjoaa myös astua komento. astua puhelu suoritetaan, kunnes nykyinen menetelmä palaa soittajalle. Yksinkertaisesti sanottuna tämä stepper suorittaa menetelmän eikä mitään muuta. Ota esimerkkinä seuraava koodisegmentti:

int kokonaisluku = testMe.getInt_value (); 

Jos tämä on nykyinen linjamme ja juoksemme astua, getInt_value () menetelmä suoritetaan. Se on kuitenkin kaikki, mitä tapahtuu. Palautusarvoksi ei aseteta kokonaisluku.

jdb Lisäksi voimme asettaa useita katkaisupisteitä. Jos haluat siirtyä yhdestä taukopisteestä suoraan seuraavaan, jdb tarjoaa jatkuu komento.

Viimeinkin haluamme tarkastella kaikkia instanssin tai luokan jäseniä. Onneksi, jdb tarjoaa kaataa ja Tulosta komennot:

main [1] dump TestMe TestMe = 0xa9: class (javaworld.TestMe) {superluokka = 0x2: class (java.lang.Object) loader = (sun.misc.Launcher $ AppClassLoader) 0xaa} main [1] tulosta 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 = Merkkijonoarvo: test int-arvo: 1 

Kun juokset kaataa tai Tulosta luokassa saat luokkatietoja, jotka sisältävät superluokan ja kuormaajatietoja. Kun juokset kaataa ja Tulosta ilmentymästä saat ilmentymätietoja, kuten datajäsenet ja heidän nykyiset arvot.

jdb tarjoaa myös komentoja pudota ja likaantua säikeissä ja pinoissa. Nämä komennot ovat kuitenkin a: n soveltamisalan ulkopuolella jdb intro.

Viimeinen asia: voit kysyä: "Kuinka käytät tehokkaasti jdb? "Käytön tehokkuus riippuu mukavuutesi tasosta jdb. Kun käytät ensimmäisen kerran jdb, tärkein komento on auta. auta command listaa jokaisen komennon ja tarjoaa joitain perustietoja aloittamisen helpottamiseksi. Kun sinulla on auta hallittu komento, löydät itsesi komennoilla, jotka asettavat katkaisupisteet yhdessä askel ja lista. Mikä tahansa näiden komentojen yhdistelmä antaa sinun aloittaa käytön jdb. askel, lista, askel, lista... pitäisi auttaa sinua löytämään nopeasti pommitettava koodi.

Lisätietoja tästä aiheesta

  • "Java-kielen virheenkorjaus" Postech ME -sivustolta

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

  • "jdbJava-virheenkorjaus, "from Java-kehittäjän viite, Mike Cohen et ai. (Sams.net Publishing, 1996)

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

Tämän tarinan "Debug with jdb" julkaisi alun perin JavaWorld.