Programmering

Fejlfind med jdb

Spørgsmål: Hvordan bruger du jdb (inkluderet i JDK 1.2-pakken) effektivt til at debugge Java-programmer?

Jeg har prøvet mange gange, men det lykkes mig kun at indlæse en klassefil til jdb; Jeg kan ikke fejle det. Det Hjælp kommando er ikke meget brugbar.

EN: Du stiller et interessant spørgsmål. For at være ærlig har jeg det aldrig Brugt jdb. Jeg har altid brugt debuggeren fra mit IDE-miljø. Så for at besvare dit spørgsmål var jeg nødt til at undersøge min egen.

Det viser sig, at Sun overvejer jdb et bevis på koncept til Java Debugger API. Java Debugger API giver os mulighed for faktisk at kigge ind i runtime og debug vores kode. Det jdb er kun en implementering af en debugger, der bruger API. Sammenlignet med de visuelle debuggere, som jeg er bekendt med (ja, jeg antager, at jeg er en wimp), er det ikke den nemmeste debugger at bruge - selvom det ligner andre kommandolinjeafbuggere, såsom gdb.

Under alle omstændigheder på dit spørgsmål. Før du forsøger at fejle din kode, skal du sørge for at bruge -g mulighed, mens du sammensætter dine klasser. Denne mulighed fortæller kompilatoren at medtage fejlretningsoplysninger i din klassefil.

Lad os definere en konstrueret klasse til test:

offentlig klasse TestMe {private int int_value; privat streng strengværdi; public static void main (String [] args) {TestMe testMe = new TestMe (); testMe.setInt_value (1); testMe.setString_value ("test"); int heltal = testMe.getInt_value (); Strengstreng = testMe.getString_value (); String toString = testMe.toString (); } public TestMe () {} public int getInt_value () {return int_value; } offentlig streng getString_value () {return string_value; } offentligt ugyldigt setInt_value (int-værdi) {int_value = værdi; } offentligt ugyldigt setString_value (strengværdi) {string_value = værdi; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Start debugger:

> jdb TestMe 

Du skulle se:

> Initialiserer jdb ...> 0xaa: klasse 

Lad os se på nogle grundlæggende kommandoer. For at indstille breakpoints skal vi kende linjenumrene eller metodens navne på de steder, hvor vi gerne vil bryde. For at få en liste over metoder skal du blot bruge metoder kommando:

> metoder TestMe ugyldig main (java.lang.String []) ugyldig () int getInt_value () java.lang.String getString_value () ugyldig setInt_value (int) ugyldig setString_value (java.lang.String) java.lang.String toString ( ) 

Det er enkelt at indstille et brudpunkt. Brug følgende syntaks:

stop i. [] 

Eller:

stop ved: 

Vi skal begynde at debugge i starten af ​​hovedmetoden:

> stop i TestMe.main Breakpoint indstillet i javaworld.TestMe.main 

Nu hvor vi har et brudpunkt, kan vi begynde at udføre. For at køre op til brudpunktet skal du blot bruge løb kommando:

> kør kør javaworld.TestMe kører ... main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 10) 

På dette tidspunkt stopper debuggeren udførelsen på den første linje i hovedmetoden. Bemærk, at markøren er ændret for at afspejle den metode, vi er i øjeblikket i.

Det liste kommandoen viser koden ved pausepunktet. En pil angiver det sted, hvor fejlfindingsprogrammet har stoppet udførelsen.

hoved [1] liste 6 private String string_value; 7 8 public static ugyldig main (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int heltal = testMe.getInt_value (); hoved [1] 

Dernæst vil vi gerne trin gennem et par linjer kode og se hvad der er ændret:

main [1] step main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 20) hoved [1] lokale Metode argumenter: Lokale variabler: dette = String værdi: null int værdi: 0 hoved [1] liste 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. (Objekt: 27) hoved [1] liste Kan ikke finde Object.java hoved [1] trin hoved [1] Breakpoint hit: javaworld.TestMe. (TestMe: 22) main [1] liste 18} 19 20 public 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] list 6 private String string_value; 7 8 public static ugyldig main (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int heltal = 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 [] args) 9 {10 TestMe testMe = new TestMe (); 11 => testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int heltal = testMe.getInt_value (); 15 Strengstreng = testMe.getString_value (); vigtigste [1] lokale Metodeargumenter: Lokale variabler: args = testMe = Strengværdi: null int-værdi: 0 

Efter hver trin, Ringede jeg til liste kommando for at se, hvor jeg var i koden. Returværdien fra kommandoen anførte linjenummeret, men på en eller anden måde hjalp det mig ikke rigtig meget.

Som vi trin, ser vi, at hovedmetoden er at konstruere en TestMe eksempel. Hvert trin fører os gennem konstruktøren og til sidst tilbage til hovedmetoden. Det lokale kommando viser alle de lokale variabler, der er synlige i den aktuelle stak. Vi ser, at der på dette tidspunkt i hovedmetoden kun er to lokale variabler: argumenterer og test mig.

Ved hjælp af trin, kan vi komme ind i en hvilken som helst af metoderne for at se, hvad der foregår. Når vi kombinerer trin med lokale kommando, vi kan se vores variabler:

main [1] step main [1] Breakpoint hit: javaworld.TestMe.setInt_value (TestMe: 36) main [1] list 32} 33 34 public void setInt_value (int value) 35 {36 => int_value = value; 37} 38 39 public void setString_value (strengværdi) 40 {main [1] locals Metodeargumenter: Lokale variabler: værdi = 1 dette = Strengværdi: null int-værdi: 0 

Hvis vi trin endnu en gang ender vi i setInt_value () metode. Hvis vi trin to gange mere indstiller metoden int_værdi medlem til 1 og vende tilbage. (For at kontrollere, om metoden indstiller værdien, skal du bruge lokale kommando.)

Selvfølgelig, når vi trin, vil vi ikke altid spore i hver metode, vi støder på. Nogle metodeopkald kan rede meget dybt. Hvis vi blev tvunget til at spore gennem et helt hierarki, er vi måske aldrig færdige. Heldigvis jdb har en måde at udføre en metode på uden sporing i denne metode: Næste kommando.

jdb giver også et par andre trin kommandoer. Det stepi kommando udfører den aktuelle instruktion. Med andre ord koden på => vil udføre, men den aktuelle linje går ikke videre til næste instruktion. Du kan ringe stepi en million gange, men => vises fra liste kommandoen bevæger sig ikke.

jdb giver også blive bedre kommando. Det blive bedre opkald udføres, indtil den aktuelle metode vender tilbage til den, der ringer op. Kort sagt, denne stepper udfører en metode og intet andet. Tag følgende kodesegment som et eksempel:

int heltal = testMe.getInt_value (); 

Hvis dette er vores nuværende linje, og vi løber blive bedre, det getInt_value () metode udføres. Det er dog alt, hvad der vil ske. Returværdien bliver ikke indstillet til heltal.

jdb giver os også mulighed for at indstille flere breakpoints. For at gå fra et brudpunkt direkte til det næste, jdb giver den fortsat kommando.

Endelig er der tidspunkter, hvor vi vil se på alle medlemmer af en instans eller klasse. Heldigvis jdb giver den dump og Print kommandoer:

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 = Strengværdi: test int-værdi: 1 

Når du løber dump eller Print på en klasse får du klasseoplysninger, der inkluderer superklasse- og loaderinformation. Når du løber dump og Print i en forekomst får du instansoplysninger, såsom datamedlemmer og deres aktuelle værdier.

jdb indeholder også kommandoer til at komme ned og snavset i tråde og stakke. Disse kommandoer er dog virkelig uden for rækkevidden af ​​a jdb intro.

Et sidste punkt: du kan spørge, "Hvordan bruger du effektivt jdb? "Effektiviteten af ​​brugen afhænger af dit komfortniveau med jdb. Første gang du bruger det jdb, den vigtigste kommando er Hjælp. Det Hjælp kommando viser hver kommando og giver nogle grundlæggende oplysninger, der hjælper dig med at komme i gang. Når du har den Hjælp kommando mestret, finder du dig selv ved hjælp af de kommandoer, der indstiller breakpoints sammen med trin og liste. Enhver kombination af disse kommandoer giver dig mulighed for at komme i gang med at bruge jdb. trin, liste, trin, liste... skal hjælpe dig med hurtigt at finde kode, der bomber dig ud.

Lær mere om dette emne

  • "Java-sprogfejlretning" fra Postech ME-webstedet

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

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

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

Denne historie, "Debug med jdb" blev oprindeligt udgivet af JavaWorld.