Programmēšana

Atkļūdot ar jdb

J: Kā jūs efektīvi izmantojat jdb (iekļauts JDK 1.2 paketē), lai atkļūdotu Java programmas?

Esmu mēģinājis daudzas reizes, taču veiksmīgi ielādēju tikai klases failu jdb; Es to nevaru atkļūdot. The palīdzība komanda nav daudz lietojama.

A: Jūs uzdodat interesantu jautājumu. Ja godīgi, tad esmu nekad izmantots jdb. Es vienmēr esmu izmantojis atkļūdotāju, ko nodrošina mana IDE vide. Tāpēc, lai atbildētu uz jūsu jautājumu, man pašam bija jāveic neliels pētījums.

Izrādās, ka Saule apsver jdb Java Debugger API koncepcijas pierādījums. Java atkļūdotāju API ļauj mums faktiski ielūkoties izpildlaikā un atkļūdot mūsu kodu. The jdb ir tikai viena atkļūdotāja, kas izmanto API, ieviešana. Salīdzinot ar vizuālajiem atkļūdotājiem, kas man ir pazīstami (jā, es domāju, ka esmu viltīgs), tas nav vieglākais atkļūdotājs, lai arī tas ir līdzīgs citiem komandrindas atkļūdotājiem, piemēram, gdb.

Jebkurā gadījumā, turpinot jūsu jautājumu. Pirms mēģināt atkļūdot kodu, noteikti izmantojiet -g opcija, sastādot savas klases. Šī opcija liek kompilatoram iekļaut klases failā atkļūdošanas informāciju.

Definēsim izdomātu klasi testēšanai:

publiskā klase TestMe {private int int_value; privāta virkne string_value; public static void main (String [] args) {TestMe testMe = new TestMe (); testMe.setInt_value (1); testMe.setString_value ("tests"); int vesels skaitlis = testMe.getInt_value (); Virknes virkne = 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 vērtība) {int_value = vērtība; } public void setString_value (virknes vērtība) {string_value = vērtība; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Sāciet atkļūdotāju:

> jdb TestMe 

Jums vajadzētu redzēt:

> Inicializē jdb ...> 0xaa: klase 

Apskatīsim dažas pamata komandas. Lai noteiktu pārtraukuma punktus, mums jāzina līniju numuri vai to metožu nosaukumi, kurās mēs vēlētos pārtraukt. Lai iegūtu metožu sarakstu, vienkārši izmantojiet metodes komanda:

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

Lūzuma punkta iestatīšana ir vienkārša. Izmantojiet šādu sintaksi:

apstājieties. [] 

Vai arī:

apstāties: 

Atkļūdošana mums jāsāk galvenās metodes sākumā:

> stop in TestMe.main Breakpoint iestatīts javaworld.TestMe.main 

Tagad, kad mums ir pārtraukuma punkts, mēs varam sākt izpildi. Lai sasniegtu lūzuma punktu, vienkārši izmantojiet palaist komanda:

> palaist palaist javaworld.TestMe darbojas ... main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 10) 

Šajā brīdī atkļūdotājs aptur izpildi galvenās metodes pirmajā rindā. Ievērojiet, ka kursors ir mainīts, lai atspoguļotu metodi, kurā mēs pašlaik atrodamies.

The sarakstā komanda parādīs kodu pārtraukuma punktā. Bultiņa norāda vietu, kur atkļūdotājs ir apturējis izpildi.

galvenais [1] saraksts 6 privāta virkne virknes_vērtība; 7 8 public static void main (String [] args) 9 {10 => TestMe testMe = jauns TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("tests"); 13 14 int vesels skaitlis = testMe.getInt_value (); galvenais [1] 

Tālāk mēs to vēlēsimies solis caur dažām koda rindiņām un uzziniet, kas ir mainījies:

main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 20) main [1] locals Metodes argumenti: Lokālie mainīgie: 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 Nevar atrast Object.java main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 22) galvenais [1] saraksts 18} 19 20 publiskais 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] saraksts 6 private String string_value; 7 8 public static void main (String [] args) 9 {10 => TestMe testMe = jauns TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("tests"); 13 14 int vesels skaitlis = testMe.getInt_value (); main [1] step main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 11) main [1] saraksts 7 8 public static void main (String [] args) 9 {10 TestMe testMe = new TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value ("tests"); 13 14 int vesels skaitlis = testMe.getInt_value (); 15 virknes virkne = testMe.getString_value (); main [1] locals Metodes argumenti: Lokālie mainīgie: args = testMe = Stīgas vērtība: null int vērtība: 0 

Pēc katra solis, Es piezvanīju sarakstā komandu, lai redzētu, kur es atrodos kodā. Atgriežamajā vērtībā no komandas tika norādīts rindas numurs, bet kaut kā tas man īsti ļoti nepalīdzēja.

Kā mēs solis, mēs redzam, ka galvenā metode ir a konstruēšana TestMe instancē. Katrs solis mūs iziet cauri konstruktoram un, visbeidzot, atgriezīsimies galvenajā metodē. The vietējie komandā ir uzskaitīti visi pašreizējā kaudzē redzamie lokālie mainīgie. Mēs redzam, ka šajā galvenās metodes vietā ir tikai divi lokālie mainīgie: argumentē un testMe.

Izmantojot solis, mēs varam iekļūt kādā no metodēm, lai redzētu, kas notiek. Kad mēs apvienojamies solis Ar vietējie komandu mēs varam redzēt mūsu mainīgos:

main [1] step main [1] Breakpoint hit: javaworld.TestMe.setInt_value (TestMe: 36) main [1] saraksts 32} 33 34 public void setInt_value (int vērtība) 35 {36 => int_value = vērtība; 37} 38 39 public void setString_value (virknes vērtība) 40 {main [1] locals Metodes argumenti: Vietējie mainīgie: vērtība = 1 šī = Stīgas vērtība: null int vērtība: 0 

Ja mēs solis vēl vienu reizi mēs nonākam setInt_value () metodi. Ja mēs solis vēl divas reizes, metode iestatīs int_value loceklis 1 un atgriezties. (Lai pārbaudītu, vai metode nosaka vērtību, izmantojiet vietējie komandu.)

Protams, kad mēs solis, mēs ne vienmēr vēlēsimies izsekot katrai sastopamajai metodei. Daži metožu izsaukumi var ligzdot ļoti dziļi. Ja mēs būtu spiesti izsekot caur visu hierarhiju, mēs, iespējams, nekad nepabeigtu. Par laimi, jdb ir veids, kā izpildīt metodi bez izsekojot šai metodei: Nākamais komandu.

jdb nodrošina arī dažus citus solis komandas. The stepi komanda izpilda pašreizējo instrukciju. Citiem vārdiem sakot, kods pie => izpildīs, bet pašreizējā rinda netiks virzīta uz nākamo instrukciju. Jūs varat piezvanīt stepi miljonu reižu, bet => parādīts no sarakstā komanda nepārvietosies.

jdb arī nodrošina pakāpies uz augšu komandu. The pakāpies uz augšu zvans tiek izpildīts, līdz pašreizējā metode atgriežas pie sava zvanītāja. Vienkārši sakot, šis steperis izpilda metodi un neko citu. Kā piemēru ņemiet šādu koda segmentu:

int vesels skaitlis = testMe.getInt_value (); 

Ja šī ir mūsu pašreizējā līnija un mēs skrienam pakāpies uz augšu, getInt_value () metode tiks izpildīta. Tomēr tas arī viss notiks. Atgriešanās vērtība netiks iestatīta uz vesels skaitlis.

jdb arī ļauj mums iestatīt vairākus pārtraukuma punktus. Lai pārietu no viena pārtraukuma punkta tieši uz nākamo, jdb nodrošina turpinājums komandu.

Visbeidzot, ir reizes, kad mēs vēlamies apskatīt visus instances vai klases locekļus. Par laimi, jdb nodrošina izgāzt un izdrukāt komandas:

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 = Stīgas vērtība: test int vērtība: 1 

Kad tu skrien izgāzt vai izdrukāt klasē jūs saņemat informāciju par klasi, kas ietver informāciju par superklasi un iekrāvēju. Kad tu skrien izgāzt un izdrukāt instancē jūs saņemat informāciju par gadījumu, piemēram, datu dalībniekus un to pašreizējās vērtības.

jdb nodrošina arī komandas, kā nokļūt lejā un sasmērēt pavedienos un kaudzēs. Tomēr šīs komandas patiešām pārsniedz a jdb ievads.

Pēdējais punkts: jūs varat jautāt: "Kā jūs efektīvi izmantojat jdbLietošanas efektivitāte būs atkarīga no jūsu komforta līmeņa ar jdb. Kad jūs pirmo reizi lietojat jdb, vissvarīgākā komanda ir palīdzība. The palīdzība komandā ir uzskaitītas katras komandas un sniegta pamatinformācija, kas palīdzēs jums sākt darbu. Kad esat ieguvis palīdzība apgūstot komandu, jūs atradīsit sevi, izmantojot komandas, kas nosaka pārtraukuma punktus solis un sarakstā. Jebkura šo komandu kombinācija ļaus jums sākt darbu jdb. solis, sarakstā, solis, sarakstā... vajadzētu palīdzēt jums ātri atrast kodu, kas jūs bombardē.

Uzziniet vairāk par šo tēmu

  • "Java valodas atkļūdošana" no Postech ME vietnes

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

  • "jdbJava atkļūdotājs "no Java izstrādātāja atsauce, Maiks Koens un citi. (Sams.net Publishing, 1996)

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

Šo stāstu "Atkļūdošana ar jdb" sākotnēji publicēja JavaWorld.

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