Programování

Ladění pomocí jdb

Otázka: Jak efektivně používáte jdb (obsažený v balíčku JDK 1.2) k ladění programů Java?

Zkoušel jsem to mnohokrát, ale jsem úspěšný pouze při načítání souboru třídy jdb; Nemohu to ladit. The Pomoc příkaz není moc užitečný.

A: Položíte zajímavou otázku. Upřímně řečeno nikdy použitý jdb. Vždy jsem používal debugger poskytovaný mým IDE prostředím. Abych tedy odpověděl na vaši otázku, musel jsem udělat vlastní průzkum.

Ukázalo se, že Sun uvažuje jdb důkaz koncepce pro API Java Debugger. Rozhraní Java Debugger API nám umožňuje nahlédnout do běhového prostředí a ladit náš kód. The jdb je jen jedna implementace debuggeru, který používá API. Ve srovnání s vizuálními debuggery, se kterými jsem obeznámen (ano, myslím, že jsem slaboch), to není nejjednodušší debugger, který lze použít - i když je to podobné jako jiné debuggery příkazového řádku, jako například gdb.

Každopádně na vaši otázku. Před pokusem o ladění kódu nezapomeňte použít -G možnost při sestavování vašich tříd. Tato možnost říká kompilátoru, aby do vašeho souboru třídy zahrnul informace o ladění.

Pojďme definovat nepřirozenou třídu pro testování:

veřejná třída TestMe {private int int_value; private String string_value; public static void main (String [] args) {TestMe testMe = new TestMe (); testMe.setInt_value (1); testMe.setString_value ("test"); int integer = testMe.getInt_value (); Řetězec řetězce = testMe.getString_value (); Řetězec toString = testMe.toString (); } public TestMe () {} public int getInt_value () {return int_value; } public String getString_value () {return string_value; } public void setInt_value (int value) {int_value = value; } public void setString_value (String value) {string_value = value; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Spusťte ladicí program:

> jdb TestMe 

Měl bys vidět:

> Inicializace jdb ...> 0xaa: třída 

Pojďme se podívat na několik základních příkazů. Abychom mohli nastavit zarážky, potřebujeme znát čísla řádků nebo názvy metod míst, kde bychom chtěli zalomit. Chcete-li získat seznam metod, jednoduše použijte metody příkaz:

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

Nastavení zarážky je jednoduché. Použijte následující syntaxi:

zastavit se. [] 

Nebo:

zastavit v: 

Měli bychom začít ladit na začátku hlavní metody:

> stop in TestMe.main Breakpoint set in javaworld.TestMe.main 

Nyní, když máme zarážku, můžeme zahájit provádění. Chcete-li dosáhnout bodu zlomu, jednoduše použijte běh příkaz:

> run run javaworld.TestMe running ... main [1] Bod zlomu: javaworld.TestMe.main (TestMe: 10) 

V tomto okamžiku ladicí program zastaví provádění na prvním řádku hlavní metody. Všimněte si, že se kurzor změnil tak, aby odrážel metodu, ve které se právě nacházíme.

The seznam příkaz zobrazí kód v bodě zlomu. Šipka označuje místo, kde debugger zastavil provádění.

main [1] seznam 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] 

Dále budeme chtít krok prostřednictvím několika řádků kódu a uvidíte, co se změnilo:

main [1] step main [1] Bod zlomu: javaworld.TestMe. (TestMe: 20) main [1] locals Argumenty metody: Místní proměnné: this = Hodnota řetězce: null int hodnota: 0 main [1] seznam 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 Nelze najít 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] seznam 6 soukromý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] seznam 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 Řetězec řetězce = testMe.getString_value (); main [1] locals Argumenty metody: Místní proměnné: args = testMe = Řetězcová hodnota: null int hodnota: 0 

Po každém krok, Zavolal jsem seznam příkaz zjistit, kde jsem byl v kódu. Návratová hodnota z příkazu vypsala číslo řádku, ale nějak mi to moc nepomohlo.

Jako my krok, vidíme, že hlavní metodou je konstrukce a Vyzkoušej mě instance. Každý krok nás provede konstruktorem a nakonec zpět do hlavní metody. The místní obyvatelé příkaz vypíše všechny místní proměnné viditelné v aktuálním zásobníku. Vidíme, že v tomto bodě hlavní metody existují pouze dvě lokální proměnné: args a Vyzkoušej mě.

Používáním krok, můžeme se dostat dovnitř kterékoli z metod, abychom zjistili, o co jde. Když kombinujeme krok s místní obyvatelé Příkaz můžeme vidět naše proměnné:

main [1] step main [1] Bod zlomu: javaworld.TestMe.setInt_value (TestMe: 36) main [1] seznam 32} 33 34 public void setInt_value (int hodnota) 35 {36 => int_value = hodnota; 37} 38 39 public void setString_value (hodnota řetězce) 40 {main [1] locals Argumenty metody: Místní proměnné: value = 1 this = Hodnota řetězce: null int hodnota: 0 

Kdybychom krok ještě jednou skončíme v setInt_value () metoda. Kdybychom krok ještě dvakrát, metoda nastaví int_value člen do 1 a zpět. (Chcete-li zkontrolovat, zda metoda nastavila hodnotu, použijte místní obyvatelé příkaz.)

Samozřejmě, když jsme krok, nebudeme vždy chtít sledovat každou metodu, se kterou se setkáme. Některá volání metod mohou být vnořena velmi hluboko. Pokud bychom byli nuceni sledovat celou hierarchii, možná bychom nikdy nedokončili. Naštěstí, jdb má způsob, jak provést metodu bez sledování této metody: další příkaz.

jdb také poskytuje několik dalších krok příkazy. The stepi příkaz provede aktuální instrukci. Jinými slovy, kód na => provede, ale aktuální řádek nepostoupí na další instrukci. Můžete volat stepi milionkrát, ale => zobrazené z seznam příkaz se nepohne.

jdb také poskytuje posílit příkaz. The posílit volání se provádí, dokud se aktuální metoda nevrátí ke svému volajícímu. Jednoduše řečeno, tento krokovač provádí metodu a nic jiného. Jako příklad si vezměte následující segment kódu:

int integer = testMe.getInt_value (); 

Pokud je to naše aktuální linka a běžíme posílitgetInt_value () metoda se provede. To je však vše, co se stane. Návratová hodnota nebude nastavena na celé číslo.

jdb také nám umožňuje nastavit více zarážek. Chcete-li přejít z jednoho bodu zlomu přímo na další, jdb poskytuje pokr příkaz.

Konečně jsou chvíle, kdy se chceme podívat na všechny členy instance nebo třídy. Naštěstí, jdb poskytuje skládka a tisk pří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] tisk 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} hlavní [1] tisk testMe testMe = Řetězcová hodnota: test int hodnota: 1 

Když běžíš skládka nebo tisk ve třídě získáte informace o třídě, které zahrnují informace o nadtřídě a zavaděči. Když běžíš skládka a tisk v instanci získáte informace o instanci, například datové členy a jejich aktuální hodnoty.

jdb také poskytuje příkazy k tomu, aby se vlákna a hromady dostaly dolů a zašpinily. Tyto příkazy však skutečně přesahují rámec a jdb intro.

Poslední bod: můžete se zeptat: „Jak efektivně využíváte jdb? "Účinnost použití bude záviset na vaší úrovni pohodlí s jdb. Při prvním použití jdb, nejdůležitější příkaz je Pomoc. The Pomoc příkaz uvádí každý příkaz a poskytuje základní informace, které vám pomohou začít. Jakmile budete mít Pomoc zvládnutí příkazu, ocitnete se spolu s příkazy, které nastavují zarážky krok a seznam. Jakákoli kombinace těchto příkazů vám umožní začít používat jdb. krok, seznam, krok, seznam... by vám měl pomoci rychle najít kód, který na vás bombarduje.

Další informace o tomto tématu

  • „Java Language Debugging,“ z webových stránek 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/PROGRAMOVÁNÍ/JAVA_Developers_Reference/ch15.htm

Tento příběh „Debug with jdb“ původně publikoval JavaWorld.