Programovanie

Ladenie pomocou jdb

Otázka: Ako efektívne používate jdb (súčasť balíka JDK 1.2) na ladenie programov Java?

Snažil som sa to mnohokrát, ale úspešný som iba pri načítaní súboru triedy do jdb; Nemôžem to odladiť. The Pomoc príkaz nie je veľmi užitočný.

A: Položíš zaujímavú otázku. Úprimne povedané, mám nikdy použité jdb. Vždy som používal debugger, ktorý poskytuje moje prostredie IDE. Aby som odpovedal na vašu otázku, musel som si urobiť malý prieskum.

Ukázalo sa, že to Sun zvažuje jdb dôkaz koncepcie rozhrania Java Debugger API. Rozhranie Java Debugger API nám umožňuje skutočne nahliadnuť do modulu runtime a ladiť náš kód. The jdb je iba jedna implementácia debuggeru, ktorý používa API. V porovnaní s vizuálnymi debuggermi, s ktorými som oboznámený (áno, myslím, že som slaboch), to nie je najjednoduchší debugger, ktorý sa dá použiť - aj keď je podobný ako iné debuggery z príkazového riadku, ako napr gdb.

V každom prípade, k vašej otázke. Pred pokusom o ladenie kódu nezabudnite použiť -g pri zostavovaní svojich tried. Táto možnosť hovorí kompilátoru, aby do súboru triedy zahrnul informácie o ladení.

Poďme definovať vykonštruovanú triedu na testovanie:

verejná trieda TestMe {private int int_value; private String string_value; public static void main (String [] args) {TestMe testMe = nový TestMe (); testMe.setInt_value (1); testMe.setString_value ("test"); int integer = testMe.getInt_value (); Reťazcový reťazec = testMe.getString_value (); Reťazec toString = testMe.toString (); } public TestMe () {} public int getInt_value () {return int_value; } public String getString_value () {return string_value; } public void setInt_value (int hodnota) {int_value = hodnota; } public void setString_value (hodnota reťazca) {hodnota_reťazca = hodnota; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Spustite ladiaci program:

> jdb TestMe 

Mali by ste vidieť:

> Inicializuje sa jdb ...> 0xaa: trieda 

Pozrime sa na niekoľko základných príkazov. Aby sme mohli nastaviť body prerušenia, musíme poznať čísla riadkov alebo názvy metód miest, kde by sme chceli zlomiť. Zoznam metód získate jednoducho pomocou metódy príkaz:

> metódy 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 ( ) 

Nastavenie bodu prerušenia je jednoduché. Použite nasledujúcu syntax:

zastaviť sa. [] 

Alebo:

zastávka na: 

Mali by sme začať ladiť na začiatku hlavnej metódy:

> zastaviť v TestMe.main Bod prerušenia nastavený v javaworld.TestMe.main 

Teraz, keď máme bod prerušenia, môžeme začať vykonávať. Ak chcete dosiahnuť bod zlomu, jednoducho použite znak bežať príkaz:

> spustiť spustiť javaworld.TestMe spustený ... hlavný [1] Bod zlomu: javaworld.TestMe.main (TestMe: 10) 

V tomto okamihu debugger zastaví vykonávanie v prvom riadku hlavnej metódy. Všimnite si, že kurzor sa zmenil, aby odrážal metódu, v ktorej sa momentálne nachádzame.

The zoznam príkaz zobrazí kód v bode zlomu. Šípka označuje miesto, kde debugger zastavil vykonávanie.

main [1] list 6 private String string_value; 7 8 public static void main (String [] args) 9 {10 => TestMe testMe = nový TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int integer = testMe.getInt_value (); hlavný [1] 

Ďalej budeme chcieť krok prostredníctvom niekoľkých riadkov kódu a uvidíte, čo sa zmenilo:

main [1] step main [1] Bod zlomu: javaworld.TestMe. (TestMe: 20) main [1] locals Argumenty metódy: Lokálne premenné: this = Hodnota reťazca: null int hodnota: 0 main [1] zoznam 16 17 String toString = testMe.toString (); 18} 19 20 => public TestMe () 21 {22} 23 24 public int getInt_value () main [1] step main [1] Bod zlomu: java.lang.Object. (Object: 27) main [1] list Nemožno nájsť Object.java main [1] step main [1] Bod zlomu: javaworld.TestMe. (TestMe: 22) main [1] list 18} 19 20 public TestMe () 21 {22 =>} 23 24 public int getInt_value () 25 {26 return int_value; main [1] step main [1] Bod zlomu: javaworld.TestMe.main (TestMe: 10) main [1] zoznam 6 súkromných String string_value; 7 8 public static void main (String [] args) 9 {10 => TestMe testMe = nový TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int integer = testMe.getInt_value (); main [1] step main [1] Bod zlomu: javaworld.TestMe.main (TestMe: 11) main [1] zoznam 7 8 public static void main (String [] args) 9 {10 TestMe testMe = new TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int integer = testMe.getInt_value (); 15 Reťazcový reťazec = testMe.getString_value (); main [1] locals Argumenty metódy: Lokálne premenné: args = testMe = Hodnota reťazca: null int hodnota: 0 

Po každej krok, Zavolal som zoznam príkaz zistiť, kde som bol v kóde. Návratová hodnota z príkazu uvádzala číslo riadku, ale nejako mi to skutočne veľmi nepomohlo.

Ako my krok, vidíme, že hlavnou metódou je konštrukcia a TestMe inštancia. Každý krok nás prevedie konštruktorom a nakoniec späť do hlavnej metódy. The miestni obyvatelia Príkaz vypíše všetky lokálne premenné viditeľné v aktuálnom zásobníku. Vidíme, že v tomto okamihu v hlavnej metóde existujú iba dve lokálne premenné: args a testMe.

Používaním krok, môžeme sa dostať do ktorejkoľvek z metód a zistiť, čo sa deje. Keď kombinujeme krok s miestni obyvatelia príkaz môžeme vidieť naše premenné:

main [1] step main [1] Bod zlomu: javaworld.TestMe.setInt_value (TestMe: 36) main [1] zoznam 32} 33 34 public void setInt_value (int hodnota) 35 {36 => int_value = hodnota; 37} 38 39 public void setString_value (hodnota reťazca) 40 {main [1] locals Argumenty metódy: Lokálne premenné: value = 1 this = Hodnota reťazca: null int hodnota: 0 

Keby sme krok ešte raz, skončíme v setInt_value () metóda. Keby sme krok ešte dvakrát, metóda nastaví int_value člen do 1 a vrátiť sa. (Ak chcete skontrolovať, či metóda nastavila hodnotu, použite znak miestni obyvatelia príkaz.)

Samozrejme, keď sme krok, nebudeme vždy chcieť sledovať každú metódu, s ktorou sa stretneme. Niektoré volania metód môžu byť vložené veľmi hlboko. Keby sme boli nútení sledovať celú hierarchiu, možno by sme nikdy neskončili. Našťastie jdb má spôsob, ako vykonať metódu bez sledovanie tejto metódy: Ďalšie príkaz.

jdb poskytuje aj niekoľko ďalších krok príkazy. The stepi príkaz vykoná aktuálnu inštrukciu. Inými slovami, kód na => sa vykoná, ale aktuálny riadok nepostúpi na ďalšiu inštrukciu. Môžeš zavolať stepi miliónkrát, ale => zobrazené z zoznam príkaz sa nepohne.

jdb tiež poskytuje zvýšiť výkon príkaz. The zvýšiť výkon volanie sa vykonáva, kým sa súčasná metóda nevráti k svojmu volajúcemu. Jednoducho povedané, tento krokový motor vykonáva metódu a nič iné. Vezmite si napríklad nasledujúci segment kódu:

int integer = testMe.getInt_value (); 

Ak je toto naša súčasná linka a bežíme zvýšiť výkon, getInt_value () metóda sa vykoná. To je však všetko, čo sa stane. Návratová hodnota nebude nastavená na celé číslo.

jdb tiež nám umožňuje nastaviť viac bodov prerušenia. Ak chcete prejsť z jedného bodu prerušenia priamo na ďalší, jdb poskytuje pokr príkaz.

Nakoniec sú chvíle, keď sa chceme pozrieť na všetkých členov inštancie alebo triedy. Našťastie jdb poskytuje skládka a tlačiť príkazy:

main [1] výpis 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] výpis testMe testMe = (javaworld.TestMe) 0xec {private java.lang.String string_value = test private int int_value = 1} main [1] print testMe testMe = Hodnota reťazca: test int hodnota: 1 

Keď bežíte skládka alebo tlačiť v triede získate informácie o triede, ktoré zahŕňajú informácie o nadtriede a načítaní. Keď bežíte skládka a tlačiť v inštancii získate informácie o inštancii, napríklad dátové členy a ich aktuálne hodnoty.

jdb tiež poskytuje príkazy na získanie a zašpinenie vlákien a stohov. Tieto príkazy sú však skutočne nad rámec a jdb úvod.

Na záver ešte jedna otázka: Môžete sa opýtať: „Ako efektívne využívate jdb? "Účinnosť použitia bude závisieť od úrovne vášho pohodlia s jdb. Pri prvom použití jdb, najdôležitejším príkazom je Pomoc. The Pomoc príkaz uvádza každý príkaz a poskytuje základné informácie, ktoré vám pomôžu začať. Len čo budete mať Pomoc príkaz zvládnete, ocitnete sa spolu s príkazmi, ktoré nastavujú hraničné hodnoty krok a zoznam. Akákoľvek kombinácia týchto príkazov vám umožní začať používať jdb. krok, zoznam, krok, zoznam... by vám mal pomôcť rýchlo nájsť kód, ktorý na vás bombarduje.

Získajte viac informácií o tejto téme

  • „Java Language Debugging,“ z webových stránok Postech ME

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

  • "jdbJava Debugger, „z Java Developer's Reference, Mike Cohen a kol. (Sams.net Publishing, 1996)

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

Tento príbeh „Debug with jdb“ pôvodne publikoval server JavaWorld.

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