jdbでデバッグする

Q: Javaプログラムをデバッグするためにjdb(JDK 1.2パッケージに含まれています)をどのように効果的に使用しますか?

何度も試しましたが、クラスファイルをjdb;にロードすることしかできません。デバッグできません。このhelpコマンドはあまり役に立ちません。

A:興味深い質問をします。正直なところ、私は使ったことがありませんjdb。私はいつもIDE環境が提供するデバッガーを使用してきました。それであなたの質問に答えるために私は私自身の少しの研究をしなければなりませんでした。

Sunjdbは、Java DebuggerAPIの概念実証を検討していることがわかりました。Java Debugger APIを使用すると、実際にランタイムを調べてコードをデバッグできます。これjdbは、APIを使用するデバッガーの実装の1つにすぎません。私が精通しているビジュアルデバッガー(はい、私は弱虫だと思います)と比較すると、使用するのが最も簡単なデバッガーではありません-などの他のコマンドラインデバッガーと似ていgdbますが。

とにかく、あなたの質問に。コードをデバッグする前に-g、クラスをコンパイルするときに必ずこのオプションを使用してください。このオプションは、クラスファイルにデバッグ情報を含めるようにコンパイラに指示します。

テスト用に考案されたクラスを定義しましょう。

public class TestMe {private int int_value; プライベート文字列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(); 文字列string = testMe.getString_value(); 文字列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; }}

デバッガーを起動します。

> jdb TestMe 

見るべき:

> jdbを初期化しています...> 0xaa:class 

いくつかの基本的なコマンドを見てみましょう。ブレークポイントを設定するには、ブレークしたい場所の行番号またはメソッド名を知る必要があります。メソッドのリストを取得するには、methods次のコマンドを使用するだけです。

>メソッドTestMevoid 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( ) 

ブレークポイントの設定は簡単です。次の構文を使用します。

で停止します。[] 

または:

で停止: 

mainメソッドの最初からデバッグを開始する必要があります。

> javaworld.TestMe.mainで設定されたTestMe.mainブレークポイントで停止します 

ブレークポイントができたので、実行を開始できます。ブレークポイントまで実行するには、run次のコマンドを使用するだけです。

> run run javaworld.TestMe running ... main [1]ブレークポイントヒット:javaworld.TestMe.main(TestMe:10) 

この時点で、デバッガーはmainメソッドの最初の行で実行を停止します。現在のメソッドを反映するようにカーソルが変更されていることに注意してください。

このlistコマンドは、ブレークポイントにコードを表示します。矢印は、デバッガーが実行を停止した場所を示します。

main [1]リスト6プライベート文字列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 integer = testMe.getInt_value(); main [1]

次に、step数行のコードを調べて、何が変更されたかを確認します。

main [1] step main [1]ブレークポイントヒット:javaworld.TestMe。 (TestMe:20)main [1] localsメソッド引数:ローカル変数:this =文字列値:null int値:0 main [1]リスト1617 String toString = testMe.toString(); 18} 19 20 => public TestMe()21 {22} 23 24 public int getInt_value()main [1] step main [1]ブレークポイントヒット:java.lang.Object。 (Object:27)main [1] listObject.javaが見つかりませんmain [1] step main [1]ブレークポイントヒット: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]ブレークポイントヒット: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 integer = testMe.getInt_value(); main [1] step main [1]ブレークポイントヒット: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 integer = testMe.getInt_value(); 15文字列文字列= testMe.getString_value(); main [1] localsメソッド引数:ローカル変数:args = testMe =文字列値:null int値:0main [1] localsメソッド引数:ローカル変数:args = testMe =文字列値:null int値:0main [1] localsメソッド引数:ローカル変数:args = testMe =文字列値:null int値:0

それぞれの後でsteplistコマンドを呼び出して、コード内のどこにいるかを確認しました。コマンドからの戻り値には行番号がリストされていましたが、どういうわけかそれはあまり役に立ちませんでした。

stepご覧のとおり、主なメソッドはTestMeインスタンスの作成です。各ステップでは、コンストラクターを通過し、最後にmainメソッドに戻ります。このlocalsコマンドは、現在のスタックに表示されているすべてのローカル変数を一覧表示します。mainメソッドのこの時点では、ローカル変数はargsとの2つしかないことがわかりますtestMe

を使用stepすることで、任意のメソッドの内部に入り、何が起こっているかを確認できます。コマンドと組み合わせるstepと、locals変数が表示されます。

main [1] step main [1]ブレークポイントヒット: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(String value)40 {main [1] localsメソッド引数:ローカル変数:value = 1 this = String value:null int value:0

私たちならばstepもう一回、私たちは、で終わるsetInt_value()方法。我々場合はstep2回以上、この方法は、設定されますint_valueにメンバを1して返します。(メソッドが値を設定したことを確認するには、localsコマンドを使用します。)

もちろん、step私たちが遭遇するそれぞれの方法を常に追跡したいとは限りません。一部のメソッド呼び出しは、非常に深くネストできます。階層全体をトレースすることを余儀なくされた場合、終了しない可能性があります。幸いなことに、そのメソッドにトレースせずにjdbメソッドを実行する方法があります:nextコマンド。

jdb他のいくつかのstepコマンドも提供します。stepiコマンドは、現在の命令を実行します。つまり、のコード=>は実行されますが、現在の行は次の命令に進みません。何stepi百万回も呼び出すことができ=>ますが、listコマンドから表示されるものは移動しません。

jdbstep upコマンドも提供します。step up呼び出しは、その呼び出し元に、現在のメソッドが戻るまで実行されます。簡単に言えば、このステッパーはメソッドを実行するだけです。例として、次のコードセグメントを取り上げます。

int integer = testMe.getInt_value(); 

これが現在の行であり、を実行するstep upと、getInt_value()メソッドが実行されます。しかし、それが起こるすべてです。戻り値はに設定されませんinteger

jdbまた、複数のブレークポイントを設定することもできます。あるブレークポイントから次のブレークポイントに直接移動するにjdbは、contコマンドを提供します。

最後に、インスタンスまたはクラスのすべてのメンバーを確認したい場合があります。幸いなことにjdbdumpprintコマンドを提供します。

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 = String value:test int値:1 

クラスを実行dumpまたは実行するprintと、スーパークラスおよびローダー情報を含むクラス情報を取得します。インスタンスを実行するdumpprint、データメンバーやその現在の値などのインスタンス情報を取得します。

jdbまた、スレッドとスタックでダウンしてダーティになるためのコマンドも提供します。ただし、これらのコマンドは実際にはjdbイントロの範囲を超えています。

最後に、「どのように効果的に使用しjdbますか?」と尋ねることができます。使用の効果は、での快適さのレベルによって異なりますjdb。を初めて使用するときjdb、最も重要なコマンドはhelpです。このhelpコマンドは、各コマンドを一覧表示し、開始に役立ついくつかの基本情報を提供します。あなたがしたらhelp、コマンドがマスターし、あなたが一緒に、ブレークポイントを設定するコマンドを使用して自分自身を見つけるsteplist。これらのコマンドを任意に組み合わせて、を使い始めることができますjdbstepliststeplist...あなたはすぐにあなたの上に爆撃されているコードを見つけやすくする必要があります。

このトピックの詳細

  • Postech MEWebサイトの「JavaLanguageDebugging」

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

  • jdbJavaDebugger」、Java Developer's Reference、 Mike Cohen、他から。(Sams.net Publishing、1996)

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

このストーリー「Debugwithjdb」は、もともとJavaWorldによって公開されました。