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/
- "
jdb
Java-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.