Programmering

Feilsøk med jdb

Spørsmål: Hvordan bruker du jdb (inkludert i JDK 1.2-pakken) effektivt for å feilsøke Java-programmer?

Jeg har prøvd mange ganger, men jeg lykkes bare med å laste en klassefil til jdb; Jeg kan ikke feilsøke det. De hjelp kommando er ikke mye bruk.

EN: Du stiller et interessant spørsmål. For å være ærlig, har jeg aldri brukt jdb. Jeg har alltid brukt feilsøkingsprogrammet fra IDE-miljøet mitt. Så for å svare på spørsmålet ditt, måtte jeg gjøre litt egen undersøkelse.

Det viser seg at Sun vurderer jdb et bevis på konseptet for Java Debugger API. Java Debugger API lar oss faktisk kikke inn i kjøretiden og feilsøke koden vår. De jdb er bare en implementering av en feilsøking som bruker API. Sammenlignet med de visuelle debuggere som jeg er kjent med (ja, jeg antar at jeg er en wimp), er det ikke den enkleste feilsøkingsprogrammet å bruke - selv om det ligner på andre kommandolinje-feilsøkere, som gdb.

Uansett, på spørsmålet ditt. Før du prøver å feilsøke koden din, må du bruke -g alternativet mens du kompilerer timene dine. Dette alternativet forteller kompilatoren å inkludere feilsøkingsinformasjon i klassefilen din.

La oss definere en konstruert klasse for testing:

offentlig klasse TestMe {private int int_value; privat streng strengverdi; public static void main (String [] args) {TestMe testMe = new TestMe (); testMe.setInt_value (1); testMe.setString_value ("test"); int heltall = 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; } offentlig ugyldig setInt_value (int-verdi) {int_value = verdi; } offentlig ugyldig setString_value (strengverdi) {string_value = verdi; } public String toString () {return "String value:" + string_value + "int value:" + int_value; }} 

Start feilsøkingsprogrammet:

> jdb TestMe 

Du bør se:

> Initialiserer jdb ...> 0xaa: klasse 

La oss ta en titt på noen grunnleggende kommandoer. For å kunne sette brytepunkter må vi kjenne linjenumrene eller metodenavnene til stedene der vi ønsker å bryte. For å få en liste over metoder, bruk bare metoder kommando:

> metoder TestMe ugyldig 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 ( ) 

Å sette et brytpunkt er enkelt. Bruk følgende syntaks:

stopp inn. [] 

Eller:

stopp ved: 

Vi bør begynne å feilsøke i begynnelsen av hovedmetoden:

> stopp i TestMe.main Breakpoint satt i javaworld.TestMe.main 

Nå som vi har et bruddpunkt, kan vi begynne å utføre. For å kjøre opp til brytpunktet, bruk bare løpe kommando:

> run run javaworld.TestMe running ... main [1] Breakpoint hit: javaworld.TestMe.main (TestMe: 10) 

På dette tidspunktet stopper feilsøkingsprogrammet kjøringen på første linje i hovedmetoden. Legg merke til at markøren har endret seg for å gjenspeile metoden vi er i.

De liste kommandoen vil vise koden ved brytpunktet. En pil indikerer stedet der feilsøkingsprogrammet har stoppet utførelsen.

hoved [1] liste 6 private String string_value; 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 heltall = testMe.getInt_value (); hoved [1] 

Deretter vil vi ønske det steg gjennom noen få kodelinjer og se hva som er endret:

main [1] trinn main [1] Breakpoint hit: javaworld.TestMe. (TestMe: 20) hoved [1] lokalbefolkningen Metodargumenter: Lokale variabler: dette = Stringverdi: null int-verdi: 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 Finner ikke Object.java hoved [1] trinn hoved [1] Brytpunktstreff: 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 void main (String [] args) 9 {10 => TestMe testMe = new TestMe (); 11 testMe.setInt_value (1); 12 testMe.setString_value ("test"); 13 14 int heltall = 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 heltall = testMe.getInt_value (); 15 Strengstreng = testMe.getString_value (); main [1] locals Metoderargumenter: Lokale variabler: args = testMe = Strengverdi: null int-verdi: 0 

Etter hver steg, Jeg ringte liste kommando for å se hvor jeg var i koden. Returverdien fra kommandoen oppførte linjenummeret, men på en eller annen måte hjalp det meg ikke veldig mye.

Som vi steg, ser vi at hovedmetoden er å konstruere en Prøv meg forekomst. Hvert trinn tar oss gjennom konstruktøren og til slutt tilbake til hovedmetoden. De lokalbefolkningen kommandoen viser alle de lokale variablene som er synlige i gjeldende stabel. Vi ser at det på dette punktet i hovedmetoden bare er to lokale variabler: argumenterer og Prøv meg.

Ved bruk av steg, kan vi komme inn på hvilken som helst av metodene for å se hva som skjer. Når vi kombinerer steg med lokalbefolkningen kommando kan vi se variablene våre:

main [1] trinn 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 (Strengverdi) 40 {main [1] locals Metoderargumenter: Lokale variabler: verdi = 1 this = Strengverdi: null int-verdi: 0 

Hvis vi steg en gang til havner vi i setInt_value () metode. Hvis vi steg to ganger til, vil metoden angi int_value medlem til 1 og tilbake. (For å sjekke om metoden angir verdien, bruk lokalbefolkningen kommando.)

Selvfølgelig når vi steg, vil vi ikke alltid spore inn i hver metode vi møter. Noen metodesamtaler kan hekke veldig dypt. Hvis vi ble tvunget til å spore gjennom et helt hierarki, ville vi kanskje aldri fullføre. Heldigvis, jdb har en måte å utføre en metode på uten spore inn i den metoden: neste kommando.

jdb gir også noen få andre steg kommandoer. De stepi kommandoen utfører den gjeldende instruksjonen. Med andre ord, koden på => vil utføre, men den nåværende linjen vil ikke gå videre til neste instruksjon. Du kan ringe stepi en million ganger, men => vises fra liste kommandoen vil ikke bevege seg.

jdb gir også trapp opp kommando. De trapp opp samtalen utføres til den gjeldende metoden går tilbake til innringeren. Enkelt sagt, denne stepperen utfører en metode og ingenting annet. Ta følgende kodesegment som et eksempel:

int heltall = testMe.getInt_value (); 

Hvis dette er vår nåværende linje og vi løper trapp opp, den getInt_value () metoden vil kjøres. Det er imidlertid alt som vil skje. Returverdien blir ikke satt til heltall.

jdb lar oss også angi flere bruddpunkter. For å gå fra ett brytpunkt direkte til det neste, jdb gir den forts kommando.

Endelig er det tider når vi vil se på alle medlemmene i en forekomst eller klasse. Heldigvis, jdb gir den dump og skrive ut 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 = Strengverdi: test int-verdi: 1 

Når du løper dump eller skrive ut på en klasse får du klasseinformasjon, som inkluderer informasjon om superklasse og laster. Når du løper dump og skrive ut på en forekomst får du forekomstinformasjon, for eksempel datamedlemmer og deres nåværende verdier.

jdb gir også kommandoer for å komme ned og skitne i tråder og stabler. Imidlertid er disse kommandoene virkelig utenfor omfanget av a jdb intro.

Et siste poeng: du kan spørre: "Hvordan bruker du effektivt? jdb? "Effektiviteten av bruken vil avhenge av komfortnivået ditt med jdb. Når du bruker den første gangen jdb, den viktigste kommandoen er hjelp. De hjelp kommandoen lister hver kommando og gir litt grunnleggende informasjon som hjelper deg med å komme i gang. Når du har hjelp kommandoen mestret, vil du finne deg selv ved å bruke kommandoene som setter brytepunkter sammen med steg og liste. Enhver kombinasjon av disse kommandoene vil tillate deg å komme i gang med å bruke jdb. steg, liste, steg, liste... burde hjelpe deg med raskt å finne kode som bomber ut på deg.

Lær mer om dette emnet

  • "Java Language Debugging," fra Postech ME-nettstedet

    //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 historien, "Feilsøk med jdb" ble opprinnelig utgitt av JavaWorld.

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