Otklanjanje pogrešaka s jdb-om

P: Kako učinkovito koristite jdb (uključen u paket JDK 1.2) za otklanjanje pogrešaka u Java programima?

Pokušao sam mnogo puta, ali uspješan sam samo u učitavanju datoteke klase u jdb; Ne mogu otkloniti pogreške. helpNaredba nije mnogo koristiti.

O: Postavljate zanimljivo pitanje. Da budem iskren, nikada nisam koristio jdb. Uvijek sam koristio program za ispravljanje pogrešaka koji pruža moje IDE okruženje. Dakle, da bih odgovorio na vaše pitanje, morao sam malo istražiti svoje.

Ispada da Sun smatra jdbdokazom koncepta za Java Debugger API. Java program za ispravljanje pogrešaka omogućuje nam da zapravo zavirimo u vrijeme izvođenja i otklonimo pogreške u našem kodu. To jdbje samo jedna implementacija ispravljača programa koji koristi API. U usporedbi s vizualnim programima za otklanjanje pogrešaka s kojima sam upoznat (da, pretpostavljam da sam wimp), to nije najjednostavniji program za ispravljanje pogrešaka - premda je sličan drugim programima za uklanjanje pogrešaka naredbenog retka, kao što je gdb.

U svakom slučaju, na vaše pitanje. Prije pokušaja otklanjanja pogrešaka u kodu, upotrijebite ovu -gopciju tijekom sastavljanja predavanja. Ova opcija govori prevoditelju da uključi podatke o otklanjanju pogrešaka u datoteku vaše klase.

Definirajmo smišljenu klasu za testiranje:

javna klasa TestMe {private int int_value; privatni niz string_value; javna statička void glavna (String [] args) {TestMe testMe = new TestMe (); testMe.setInt_value (1); testMe.setString_value ("test"); int cijeli broj = testMe.getInt_value (); Niz niza = testMe.getString_value (); Niz toString = testMe.toString (); } javni TestMe () {} javni int getInt_value () {return int_value; } javni String getString_value () {return string_value; } javna praznina setInt_value (int vrijednost) {int_value = vrijednost; } javna praznina setString_value (vrijednost niza) {string_value = vrijednost; } javni String toString () {return "Vrijednost niza:" + string_value + "int vrijednost:" + int_value; }}

Pokrenite program za ispravljanje pogrešaka:

> jdb TestMe 

Trebali biste vidjeti:

> Inicijalizacija jdb ...> 0xaa: klasa 

Pogledajmo neke osnovne naredbe. Da bismo postavili točke prekida, moramo znati brojeve linija ili nazive metoda mjesta na kojima bismo željeli prekinuti. Da biste dobili popis metoda, jednostavno upotrijebite methodsnaredbu:

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

Postavljanje točke prekida je jednostavno. Koristite sljedeću sintaksu:

navratite. [] 

Ili:

zaustaviti se na: 

Otklanjanje pogrešaka trebali bismo započeti na početku glavne metode:

> zaustavi se u TestMe.main Točka prijelaza postavljena u javaworld.TestMe.main 

Sad kad imamo točku prekida, možemo započeti izvršenje. Da biste došli do točke prekida, jednostavno upotrijebite runnaredbu:

> pokreni pokreni javaworld.TestMe trči ... glavna [1] Pogođena točka: javaworld.TestMe.main (TestMe: 10) 

U ovom trenutku program za pronalaženje pogrešaka zaustavlja izvršavanje u prvom retku glavne metode. Primijetite da se kursor promijenio kako bi odražavao metodu u kojoj se trenutno nalazimo.

listNaredba će prikazati kod na prijelomna točka. Strelica označava mjesto na kojem je program za pronalaženje pogrešaka zaustavio izvršenje.

glavni [1] popis 6 privatni niz string_value; 7 8 javna statička void glavna (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int cijeli broj = testMe.getInt_value (); glavni [1]

Zatim ćemo stepproći kroz nekoliko redaka koda i vidjeti što se promijenilo:

glavni [1] korak glavni [1] Pogodak prijeloma: javaworld.TestMe. (TestMe: 20) main [1] local Argumenti metode: Lokalne varijable: this = Vrijednost niza: null int vrijednost: 0 main [1] popis 16 17 String toString = testMe.toString (); 18} 19 20 => javni TestMe () 21 {22} 23 24 public int getInt_value () glavni [1] korak glavni [1] Pogodak točke prekida: java.lang.Object. (Objekt: 27) glavni [1] popis Nije moguće pronaći Object.java glavni [1] korak glavni [1] Pogodak točke prekida: javaworld.TestMe. (TestMe: 22) glavni [1] popis 18} 19 20 javni TestMe () 21 {22 =>} 23 24 public int getInt_value () 25 {26 return int_value; glavni [1] korak glavni [1] Pogodak prijeloma: javaworld.TestMe.main (TestMe: 10) glavni [1] popis 6 privatni niz string_value; 7 8 javna statička void glavna (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test");13 14 int cijeli broj = testMe.getInt_value (); glavni [1] korak glavni [1] Pogodak prijeloma: javaworld.TestMe.main (TestMe: 11) glavni [1] popis 7 8 javna statička praznina main (String [] args) 9 {10 TestMe testMe = new TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int cijeli broj = testMe.getInt_value (); 15 string string = testMe.getString_value (); glavni [1] domaći Argumenti metode: Lokalne varijable: args = testMe = Vrijednost niza: null int vrijednost: 0glavni [1] domaći Argumenti metode: Lokalne varijable: args = testMe = Vrijednost niza: null int vrijednost: 0glavni [1] domaći Argumenti metode: Lokalne varijable: args = testMe = Vrijednost niza: null int vrijednost: 0

Nakon svake step, nazvao sam listnaredbu da vidim gdje sam u kodu. Povratna vrijednost iz naredbe navela je broj retka, ali nekako mi to zapravo nije puno pomoglo.

Kao i mi step, vidimo da je glavna metoda konstruiranje TestMeinstance. Svaki korak vodi nas kroz konstruktor i konačno natrag u glavnu metodu. U localsnaredba popis svih lokalnih varijabli vidljive u trenutnom snopu. Vidimo da u ovom trenutku u glavnoj metodi postoje samo dvije lokalne varijable: argsi testMe.

Korištenjem stepmožemo ući u bilo koju od metoda kako bismo vidjeli što se događa. Kada kombiniramo steps localsnaredbom možemo vidjeti naše varijable:

glavni [1] korak glavni [1] Pogodak prijeloma: javaworld.TestMe.setInt_value (TestMe: 36) main [1] popis 32} 33 34 javna praznina setInt_value (int vrijednost) 35 {36 => int_value = value; 37} 38 39 javna praznina setString_value (vrijednost niza) 40 {main [1] local Argumenti metode: Lokalne varijable: value = 1 this = Vrijednost niza: null int vrijednost: 0

Ako još stepjednom, završimo u setInt_value()metodi. Ako ponovimo još stepdva puta, metoda će postaviti int_valuečlana 1i vratiti se. (Da biste provjerili je li metoda postavila vrijednost, upotrijebite localsnaredbu.)

Naravno, kada to učinimo step, nećemo uvijek željeti ući u trag svakoj metodi s kojom se susrećemo. Neki pozivi metoda mogu se ugnijezditi vrlo duboko. Kad bismo bili prisiljeni tragati kroz čitavu hijerarhiju, možda nikada ne bismo završili. Srećom, jdbima način da izvrši metodu bez trasiranja u nju: nextnaredba.

jdbtakođer nudi nekoliko drugih stepnaredbi. stepiNaredba izvršava trenutno pouku. Drugim riječima, kod po =>volji će se izvršiti, ali trenutni redak neće preći na sljedeću uputu. Možete nazvati stepimilijun puta, ali =>prikazano iz listnaredbe neće se pomaknuti.

jdbtakođer pruža step upnaredbu. step upPoziv izvršava sve do sadašnjih metoda vraća na svoje pozivatelja. Jednostavno rečeno, ovaj steper izvršava metodu i ništa drugo. Uzmimo sljedeći segment koda kao primjer:

int cijeli broj = testMe.getInt_value (); 

Ako je ovo naša trenutna linija i pokrenemo step up, getInt_value()metoda će se izvršiti. Međutim, to je sve što će se dogoditi. Povratna vrijednost neće se postaviti na integer.

jdbtakođer nam omogućuje da postavimo više točaka prekida. Da biste prešli s jedne točke prekida izravno na drugu, jdbpruža contnaredba.

Napokon, postoje trenuci kada želimo pogledati sve članove instance ili klase. Srećom, jdbpruža dumpi printnaredbe:

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 = Vrijednost niza: test int vrijednost: 1 

Kada trčite dumpili printna predavanju, dobit ćete informacije o nastavi, koje uključuju podatke o superklasi i učitavaču. Kada pokrenete dumpi printna instanci, dobivate informacije o instanci, kao što su članovi podataka i njihove trenutne vrijednosti.

jdbtakođer pruža naredbe za spuštanje i prljanje u nitima i hrpama. Međutim, ove su naredbe stvarno izvan dosega jdbuvodnog teksta.

Posljednja točka: možete se zapitati: "Kako učinkovito koristite jdb?" Učinkovitost upotrebe ovisit će o vašoj razini udobnosti s jdb. Kada prvi put koristite jdb, najvažnija naredba je help. U helpnaredba sadrži popis svih naredbi i pruža osnovne informacije će vam pomoći da započnete. Jednom kad helpsavladate naredbu, naći ćete se pomoću naredbi koje postavljaju točke prekida, zajedno sa stepi list. Bilo koja kombinacija tih naredbi omogućit će vam početak korištenja jdb. step, list, step, list... treba pomoći da brzo pronaći kôd koji se bombardiranja na vas.

Saznajte više o ovoj temi

  • "Otklanjanje pogrešaka Java jezika" s web stranice Postech ME

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

  • " jdbJava Debugger", iz Java Developer's Reference, Mike Cohen, et al. (Sams.net Publishing, 1996)

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

Ovu priču "Otklanjanje pogrešaka s jdb-om" izvorno je objavio JavaWorld.