S-JIS[2008-10-25/2008-11-15] 変更履歴
ブレークポイントは、実行時にその位置に来る(あるいは指定された状況が発生する)と実行が停止(中断)されるもの。
以下のような方法でブレークポイントを設定・削除できる。
種類 | 位置 | 内容 | 補足 |
---|---|---|---|
メソッド・ブレークポイント | メソッド名の位置 | そのメソッドが呼ばれた時に停止する。 | リフレクション(invoke())で呼ばれた場合も停止する。 |
行ブレークポイント | メソッド内の行 | その位置に来た時に停止する。 | |
監視ポイント | フィールド | そのフィールド(メンバー変数)が使用された時(読み書きされる時)にその箇所で停止する。 | リフレクション(set()・get()等)で使用された場合は停止しない。 |
Java例外ブレークポイント | 例外発生 | 指定した例外が発生した時に発生箇所で停止する。 |
現在どのようなブレークポイントが設定されているかは、ブレークポイントビューで確認できる。
ブレークポイントビューに表示されている各ブレークポイントを右クリックしてプロパティーを表示することで、細かい設定をすることも出来る。
普通にmain()で始まるプログラム(直接Eclipseから実行できるプログラム)をデバッグする(ブレークポイントで止まるような実行をする)為には、デバッグモードで実行する必要がある。
Eclipse上から実行しないJavaプログラム(つまりバッチやシェル等から実行するJavaプログラム)もデバッグすることが出来る。
バージョン | オプションの例 | ヘルプの表示方法 |
---|---|---|
JDK1.4 | java -Xdebug
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y 実行クラス |
java -Xrunjdwp:help |
JDK1.5以降 | java
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y 実行クラス |
java -agentlib:jdwp=help |
サブオプション | 値の例 | 概要 |
---|---|---|
transport | dt_socket | ソケット通信によるリモートデバッグ。 |
address | 8000 localhost:8000 |
デバッガー(Eclipse)が接続する為の(IPアドレスと)ポート。 ポート番号は、現在使われていないものを適当に使う。 |
server | y | 大抵y。yだと、デバッガーがJavaプログラムとは別(サーバーである)ことを示す。 |
suspend | y n |
y:デバッガー(Eclipse)が接続してくるまで実行を停止して待つ。 n:接続を待たない。APサーバーのように実行時間が長いものは待つ必要ないかも。 |
timeout | 10000 | 接続してくるまで待つ為のタイムアウト時間(ミリ秒)。 |
Eclipseで外部Javaアプリのデバッグをする(デバッグ情報を受け取る)には、以下のようにデバッグ実行する。
実行が停止(実行中断)されると、Eclipse上で色々操作することが出来る。[2008-11-08]
操作 | ツールバー | メニュー | キー | 概要 | |
---|---|---|---|---|---|
再開 | 再開 | メニューバー | 「実行(R)」→「再開(M)」 | F8 | 実行を再開する。 |
中断 | 中断 | メニューバー | 「実行(R)」→「中断(S)」 | 実行を停止する。 | |
終了 | 終了 | メニューバー | 「実行(R)」→「終了(T)」 | Ctrl + F2 | デバッグ対象のアプリケーションを終了させる。 |
切断 | 切断 | (リモートデバッグの場合)デバッグ対象との接続(通信)を切断(終了)する。 | |||
ステップ・イン | ステップイン | メニューバー | 「実行(R)」→「ステップイン(I)」 | F5 | 1ステップ実行する。メソッドであれば、そのメソッドに入って停止する。 |
ステップ・オーバー | ステップ・オーバー | メニューバー | 「実行(R)」→「ステップ・オーバー(O)」 | F6 | 1ステップ実行する。メソッドであれば、そのメソッドを実行する。 |
ステップ・リターン | ステップ・リターン | メニューバー | 「実行(R)」→「ステップ・リターン(U)」 | F7 | 現在のメソッドからreturnするまで実行する。戻ったところで実行を停止する。 |
フレームにドロップ | フレームにドロップ | 現在のスタック・フレームに再入する。つまり、現在のメソッドの先頭に戻る。 (ローカル変数はクリアされるが、グローバルに変更した値が元に戻るわけではない) (ブレークポイントにより停止したメソッド内でしか使えないっぽい) |
|||
ステップ・フィルター | ステップ・フィルターの使用 | メニューバー | 「実行(R)」→「ステップ・フィルターの使用(F)」 | Shift + F5 | ステップ・フィルターの有効・無効を切り替える。 ステップ・フィルターは、ステップ実行(?)で入る必要の無いクラスを指定するもの。java.*とかjavax.*等を想定しているらしい。 メニューバーの「ウィンドウ(W)」→「設定(P)」⇒「Java-デバッグ-ステップ・フィルター」でフィルターしたいクラスを指定する。 |
全てのインスタンス | ソース上でクラスを選択して右クリック→「すべてのインスタンス(T)」 | Ctrl + Shift + N | 指定されたクラスのインスタンスを全て表示する。 | ||
強制リターン | (ソース上で値を選択して)右クリック→「強制リターン(F)」 | Alt + Shift + F | (Eclipse3.3からの新機能で、JDK1.6以降でしか使えないらしい) 現在のメソッドから即座にreturnする。 ソース上で選択していた箇所の値が戻り値となる。型が違っていたらエラーになってreturnできない。 戻り型がvoidのメソッドの場合は特に値を指定する必要は無い。 |
||
監視 | ソース上で変数(や式)を選択して右クリック→「監視(T)」 | 選択した変数や計算式を「式」ビューに(“監視式”として)追加する。 | |||
インスペクション | ソース上で変数や式を選択して右クリック→「インスペクション(E)」 | Ctrl + Shift + I | 選択した式の演算結果をポップアップで表示する。 ここでCtrl+Shift+Iを押すと、選択している式が「式」ビューに(“インスペクション式”として)追加される。 ※選択した式の中にメソッドがあれば、それも実行されるので注意 |
||
表示 | ソース上で変数や式を選択して右クリック→「表示(Y)」 | Ctrl + Shift + D | 選択した式の演算結果をポップアップで表示する。 ここでCtrl+Shift+Dを押すと、選択している式と演算結果が「表示」ビューに表示される。 ※選択した式の中にメソッドがあれば、それも実行されるので注意 |
||
実行 | ソース上で式や文を選択して右クリック→「実行(X)」 | Ctrl + U | 選択した式や文を実行する。 (メソッドを呼び出したり変数に値をセットしたり出来る) (ただし、return文を実行してもメソッドから抜けるわけではない) |
||
指定行まで実行 | ソース上の行を右クリック→「指定行まで実行(L)」 | Ctrl + R | 実行を再開し、ソース上のカーソルがある行(=指定行)まで来たら停止する。 (途中で他のブレークポイントにより停止することもある) (if文等による分岐で指定行を通らない場合は、そのまま処理が続行されてゆく…) ステップ実行中にfor文等のループに来て、そこを抜けたい場合に便利。 |
インスペクションと表示は機能が似ているので、使い分けがいまいち分からないが…。
現在のメソッドから参照できる変数(ローカル変数・フィールド等)全ての値を一覧表示するビュー。[2008-11-08]
デバッグパースペクティブではデフォルトで表示される(と思う)が、メニューバーの「ウィンドウ(W)」→「ビューの表示(V)」→「変数」で表示することが出来る。
変数名に対しその値が表示される。プリミティブ型やStringの場合は、中身がそのまま表示される。
それ以外の参照型の場合はクラス名が表示される。この場合、変数名の欄が折りたたみになってフィールドが表示できるようになっているので、それを追っていけば中を確認することが出来る。
また、下部のペインに(たぶんtoString()を呼んだ結果の)値が表示される。
また、右クリック→「監視式の作成(T)」で「式」ビューに監視式として追加することも出来る。
「変数」ビューでは、プリミティブ型やStringの場合、値欄をクリックすれば値を変更することが出来る。
それ以外の参照型の場合でも、右クリック→「値の変更(C)」で値を変更することが出来る。
例えばString配列なら「new String[]{ "abc", "def" }
」といった具合。
監視式やインスペクション式を表示するビュー。[2008-11-08]
メニューバーの「ウィンドウ(W)」→「ビューの表示(V)」→「式」で表示することが出来る。
変数や式を「式」ビューに追加しておくと、それらが一覧表示される。
個々の式を選択すると、右側にその値が表示される。参照型の場合、たぶんtoString()を呼んだ結果が返る。
監視式の追加は、右クリック→「監視式を追加(A)」や、インスペクション操作から行う。
インスペクション式の場合、右クリック→「監視式に変換(W)」で監視式に変更できる。
式には「変数のみ」だけでなく、演算やメソッド呼び出し、果ては文を書くことも出来る。
例えばMapの変数mapに対し、以下のような監視式が定義できる。
map
map.size()
new java.util.TreeMap(map)
StringBuilder sb = new StringBuilder(); for (Object key : map.keySet()) { if (sb.length() > 0) sb.append(", "); sb.append(key); sb.append("=\""); sb.append(map.get(key)); sb.append("\""); } return sb;
なお、変数は、現在表示中のメソッドのスコープから見られる変数が使われる。
(つまり、同名の変数であっても、デバッグ中のメソッドによってはローカル変数だったり親クラスのフィールドだったりする)
監視式の削除はDeleteキーまたは右クリック→「除去(O)」で行える。
変数の内容や式の演算結果を一時的に表示するビュー。[2008-11-08]
表示する操作を行えば自動的に出てくるが、メニューバーの「ウィンドウ(W)」→「ビューの表示(V)」→「
表示」で表示することも出来る。
表示ビューの中は自由に編集する(Javaソースを書く)ことが出来る。
そして、ここで書いたソースも(選択して右クリックからメニューを開くことにより)インスペクション・表示・実行・監視・強制リターンに使うことが出来る!
n = 1
↑表示ビューに上記の内容を書いて全選択(Ctrl+A)して実行(Ctrl+U)すると、変数に値をセットすることが出来る。
Map m = new HashMap(); m.put("ZZZ", "zzz"); returm m;
↑Mapを返すメソッドの中で停止させ、表示ビューに上記の内容を書いて全選択(Ctrl+A)して強制リターンさせると、このマップを返した状態になる。
throw new RuntimeException("zzz");
↑全選択(Ctrl+A)して実行(Ctrl+U)すると、例外を発生させることが出来る。[2008-11-15]
その際の(スタックトレースの)例外発生箇所は、デバッグで停止していた行になる。