<!DOCTYPE HTML> <html lang = "ja"> <head> <title>トレースデバッガ (逆方向)</title> <meta charset = "UTF-8"> <link rel = "stylesheet" type = "text/css" href = "../../prettify.css"> <script type="text/javascript"> function init(param) { var course = "A"; if (param) { var c = getParam('course', param); if (c) course = c; } var next = document.getElementById("next"); if (course == 'A') { next.href = "../../courseA/CourseStartA.html"; } else if (course == 'B') { next.href = "../../courseB/CourseStartB.html"; } } function getParam(name, url) { name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); } </script> </head> <body onLoad="init(location.search)"> <h1>トレースデバッガ (逆方向)</h1> <hr> <h2>説明</h2> <p> このデバッガでは, プログラムの実行時情報が記録されたファイルであるトレースファイルを読み込み, その読み込んだトレースを元にデバッグ実行を行うができます.<br> こちらは, 先ほど見ていただいた順方向のトレースデバッガをベースに, さらに以下の機能を拡張したものになっています.<br> <ul> <li>ステップ系の実行(ステップオーバー、ステップイン、ステップリターン)を逆方向に行うステップバック系の機能</li> <li>現在の実行時点を登録し, 任意のタイミングで登録した実行時点に移ることができる機能</li> <li>フィールドが参照しているオブジェクトやコレクションから取得してきたオブジェクトに対して, そのオブジェクトが実際に代入または追加された時点まで遡る機能</li> <li>プログラム中でオブジェクトAがオブジェクトBを参照する構造が作られた際に, それらのオブジェクトがどのように接近してきたのかの過程を抽出する機能</li> </ul> </p> <p> <p class = "explanation"> メニューバーの Window → Perspective → Open Perspective → Other... → トレースデバッガ(逆方向) でトレースデバッガのパースペクティブを開いてください.<br> <div class = "image"><img src = "./images/OpenPerspective.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/OpenPerspective_Reverse_1.png" class = "halfSize"></div> </p> <p class = "explanation"> 実際に「トレースデバッガ(逆方向)」のパースペクティブを開くと下図のような状態になります.<br> このパースペクティブは初期状態では6つのビューで構成されており, 左上が呼び出しスタックビュー, その横が変数ビュー, 左下がエディタ,<br> 右上がブレークポイントビュー, その下が現在の実行時点ビュー, さらに下が実行時点の登録ビューになっています.<br> <div class = "image"><img src = "./images/OpenPerspective_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> このデバッガには, 「再開」を逆向きに行う機能があります.<br> ブレークポイントビューの「逆向きに再開」アイコンをクリックすると, 有効なブレークポイントが入っている行のうち,<br> 現在の実行時点よりも前の実行で最も近い行にまで実行が進み, そこで実行が再び一時停止します.<br> もし, 該当する行がなかった場合は, そのままデバッグ実行が終了します.<br> <div class = "image"><img src = "./images/BackResume_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/BackResume_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> このデバッガには, 「ステップオーバー」を逆向きに行う機能があります.<br> ブレークポイントビューの「ステップバックオーバー」アイコンをクリックすると, 実行を行単位で戻ります.<br> この画像の場合では, ステップバックオーバーによって, D クラスの passB(B) メソッドの7行目から6行目へと実行が戻っています.<br> <div class = "image"><img src = "./images/StepBackOver_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/StepBackOver_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> このデバッガには, 「ステップイン」を逆向きに行う機能があります.<br> ブレークポイントビューの「ステップイン」アイコンをクリックすると, 実行をステートメント単位で戻り,<br> 呼び出し先のメソッドがある場合はその呼び出し先のメソッドに後ろから入ります.<br> この画像の場合では, ステップバックインによって, ひとつ前の呼び出し先である E クラスの setC() メソッドへ入っています.<br> なお, 逆方向に戻っていく関係上, 呼び出し先メソッドの開始時点ではなく終了時点に現在の実行が移る点に注意してください.<br> <div class = "image"><img src = "./images/StepBackInto_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/StepBackInto_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> このデバッガには, 「ステップリターン」を逆向きに行う機能があります.<br> ブレークポイントビューの「ステップバックリターン」アイコンをクリックすると, 呼び出し元からそのメソッドに入る直前まで実行を戻ります.<br> この画像の場合では, ステップバックリターンによって, この E クラスの setC(C) メソッドが呼び出される直前の時点, <br> すなわち, 呼び出し元である D クラスの passB(B) メソッドの7行目まで実行が戻ります.<br> ,<br> <div class = "image"><img src = "./images/StepBackReturn_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/StepBackReturn_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> ブレークポイントビューの「ステップネクスト」アイコンをクリックすると, 実行をステートメント単位で進めます.<br> 「ステップイン」とは違い, こちらは呼び出し先のメソッドがあったとしても, その呼び出し先のメソッドには入ることはありません.<br> 「ステップオーバー」では行単位で実行が進んでしまいますが, 「ステップネクスト」ではより細かいステートメント単位で同一メソッド実行内を進むことができます.<br> この画像の場合では, 現在のメソッド呼び出しステートメントである B.getC() の呼び出し先には入らずに, <br> そのまま次のメソッド呼び出しステートメントである E.setC(C) の直前にまで実行が進んでいます.<br> <div class = "image"><img src = "./images/StepNext_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/StepNext_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 実行時点の登録ビューでは, 任意のタイミングで現在の実行時点を登録することができます.<br> 現在の実行時点を登録するには, ビュー上にある追加ボタンをクリックしてください.<br> 登録された実行時点はビュー上に一覧で表示されます. <div class = "image"><img src = "./images/Register_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/Register_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> また, 登録した実行時点へはいつでもジャンプすることができます<br> ビュー上に登録されている実行時点をクリックすると, その登録した場所に対応するソースコードがエディタ上で開きます.<br> また, ダブルクリックで選択するか, 選択した状態でジャンプボタンをクリックすると, 選んだ実行時点へと現在の実行時点が移ります.<br> <div class = "image"><img src = "./images/Register_Reverse_3.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/Register_Reverse_4.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 変数ビューで this などを開き, フィールドを選択した状態で右クリックすると, ポップアップメニューが表示されます.<br> ここで, 「値の代入時点に飛ぶ」を選択すると, このフィールドで参照されているオブジェクトが実際に代入される直前の時点まで実行を遡ることができます.<br> <div class = "image"><img src = "./images/BackToMoment_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/BackToMoment_Reverse_2.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 変数ビュー上で「フィールド代入前」などを開き, その中にある参照先などを右クリックすると, ポップアップメニューが表示されます.<br> ここで, 「オブジェクトの接近過程抽出」を選択すると, 参照元となるオブジェクトと参照先となるオブジェクトがどのようにして接近してきたのかの過程を抽出することができます.<br> <div class = "image"><img src = "./images/Delta_Reverse_1.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/Delta_Reverse_3.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/Delta_Reverse_4.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 「オブジェクト接近過程」ビュー上の「開始時点」をクリックすると, 参照先側のオブジェクトがどのように接近してきたのかの過程について,<br> その開始時点となるメソッド実行に飛ぶことができます.<br> <div class = "image"><img src = "./images/Delta_Reverse_5.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 「オブジェクト接近過程」ビュー上の「参照先側」をクリックすると, 参照先側のオブジェクトがどのように接近してきたのかの過程について各時点に飛んで見ていくことができます.<br> <div class = "image"><img src = "./images/Delta_Reverse_6.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/Delta_Reverse_7.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 「オブジェクト接近過程」ビュー上の「参照元側」をクリックすると, 参照元側のオブジェクトがどのように接近してきたのかの過程について各時点に飛んで見ていくことができます.<br> <div class = "image"><img src = "./images/Delta_Reverse_8.png" class = "threeQuartersSize"></div> <div class = "image"><img src = "./images/Delta_Reverse_9.png" class = "threeQuartersSize"></div> </p> <p class = "explanation"> 「オブジェクト接近過程」ビュー上の「参照時点」をクリックすると, 参照元側のオブジェクトが参照先側のオブジェクトを参照するようになる時点に飛ぶことができます.<br> <div class = "image"><img src = "./images/Delta_Reverse_10.png" class = "threeQuartersSize"></div> </p> </p> <a id="next" href="../../courseA/CourseStartA.html">実験開始の説明へ進む</a> </body> </html>