Skip to content

Latest commit

 

History

History
93 lines (83 loc) · 9.21 KB

File metadata and controls

93 lines (83 loc) · 9.21 KB

デバッガの利甚


  • どんな時にデバッガを䜿うか
    • プログラムは動くが、想定通りの動䜜をしおくれない時。動䜜を確認しながらコヌドを远えるため、コヌドを読むために䜿うこずも珍しくない
      • 察応方法
        • case 1) ErrorやExceptionが出るなら、該圓するコヌド行ず出力内容を参考にし぀぀、芁因を掚定しお、察策を怜蚎する。
        • case 2) 関連しそうな倉数を片っ端からprint出力しおみお芁因特定する。
        • case 3) デバッガを䜿い、芁因を絞り蟌み぀぀察策を怜蚎する。
  • デバッガの皮類
    • タヌミナルで操䜜: jdb
    • IDEで操䜜: jdbのラッパヌになっおいるので、基本的な操䜜は䞀緒。コマンドをタヌミナル䞊で入力するか、GUIで入力するかが違うぐらい。
      • IDEでデバッガを䜿う際のメリット
        • どの行を実行しようずしおるのか確認しやすい。
        • 倉数の䞭身をいちいちprintせずずも参照できる。

  • step 1: 動䜜を䞀時的に止めたい行にブレヌクポむント(breakpoint)を蚭定する。
    • 思い぀かないならmain()メ゜ッド1行目に蚭定するのも手。ブレヌクポむントは耇数蚭定できるし、埌から削陀するこずも可胜なので取り敢えず1箇所は蚭定しよう。
  • step 2: デバッガを起動デバッグ実行する。
  • step 3: デバッグ実行しながら想定通りに凊理が進んでいるかどうかを確認する。
    • 基本的な実行継続方法:
      • step over: 今いるスタックで停止行のコヌドを凊理し、次の行に移動するたで実行する。次の行に移動したら䞀時停止する。
      • step into: 停止行がメ゜ッド呌び出しの堎合、そのメ゜ッド内に移動する。
        • step into(force): System.out.println()等暙準メ゜ッドの堎合、そのメ゜ッド内に移動したくないこずが倚い。このため、デフォルトの step into では、暙準メ゜ッドの堎合には䞭に移動しない。それに察し、あらゆるメ゜ッドに察しお䞭に移動したい堎合には force するず良い。
      • step out: 今いるスタックから抜けるたで実行を続け、抜けたら䞀時停止する。
    • 「想定通りに凊理が進んでいるかどうか」は、倉数の䞭身を確認するこずで怜蚌できるはずである。
    • 必芁に応じお条件を蚭定 (conditional breakpoint)する。
  • 泚意
    • IDEでデバッグ実行するず、終了するたではデバッガが動いたたたになる。そのこずに気づかず「䞀時停止状態のたたもう䞀床デバッグ実行」するず、耇数デバッガが動く。実行䞭の分だけデバッグが走り続けるため、メモリ等リ゜ヌスを食いたくるので泚意。
    • 察策
      • デバッガで䞀時停止させおるなら、それを停止させおから新しくデバッグ実行する。

  • コヌド䟋: noisy_file
  • 環境準備動䜜確認
    • コヌドの準備
      • IntelliJを起動し、䞊蚘コヌド䟋のリポゞトリURLからクロヌンを䜜成する。
    • ReadCSVFileクラスを実行しよう。゚ラヌが出るはずだ。
      • コヌド抂芁
        • CSVファむルdata/daily_access.csvが甚意されおいる。1列目は日付。2列目はアクセス数integerを想定。
        • 䞊蚘ファむルを1行ず぀読み蟌み、String.split(",")でカンマ区切りの分割する。
        • 分割した1぀目日付をString型ずしお保存。2぀目アクセス数をInteger.parseInt()でinteger型に倉換しお保存。
      • コヌド抂芁を螏たえ、゚ラヌ出力から芁因を掚枬しおみよう。
  • 今回のケヌスは、゚ラヌ出力から芁因特定は容易。だけどデバッガ緎習のためにデバッグ実行しおみよう。
    • step 1: 動䜜を䞀時的に止めたい行にブレヌクポむント(breakpoint)を蚭定する。
      • 今回はmainメ゜ッドの冒頭行である、16行目に蚭定しおみよう。
    • step 2: デバッガを起動デバッグ実行する。
      • RunではなくDebugから実行。するずブレヌクポむントに達するたで凊理し続け、たどり着いたら䞀時停止する。今回は16行目で停止するはずだ。
        • 停止しおる状態で「背景が濃いブルヌになっおる行」は、次に実行する行。ただその行は実行しおいない。
    • step 3: デバッグ実行しながら想定通りに凊理が進んでいるかどうかを確認する。
      • step over➘ しおみよう。実行する床に「今いるスタック内で次の行に移動しお䞀時停止」するはずだ。たた、倉数がどのように曎新されおいるかも確認できるはずだ。
        • while文の䞭を繰り返すこずを確認できたら、デバッガを䞀床停止巊䞋の赀い四角しお、改めおデバッガを起動しよう。たた16行目で停止しおいる状態。
      • step into青い↓ しおみよう。25行目たでは単に「次の行」に移動しお停止しおいたはずだが、25行目の次には10行目に移動するはずだ。これは「step intoはメ゜ッドが呌ばれたらその䞭に移動しお、䞀時停止する」から。
        • 補足
          • 「青いstep into」は、自䜜メ゜ッドのみ䞭に移動。通垞はこちらで十分なはず。
          • 「赀いstep into (force)」は、暙準メ゜ッドであっおも䞭に移動。
        • lineProcess()内で䞀時停止しおいる状態で、次の手続きを溜めそう。
      • step out➚ しおみよう。次の行ではなく「lineProcess()を呌び出したスタック内の次の行」に移動しお䞀時停止しおいるはずだ。step outは「今いるスタック内を凊理し終えおから停止させたい」時に䜿甚。

  • チュヌトリアル1で、lineProcess()にいる状態で䞀旊操䜜を止めよう。
    • 通垞実行時には、今いるメ゜ッド内の状態スコヌプ範囲内の状態しか参照できない。
      • 䟋えば、lineProcess()メ゜ッド内で停止しおいる最䞭だず、匕数であるline, countに加え、メ゜ッド内で宣蚀しおいるロヌカル倉数items, str, valueの5倉数たでしか参照できない。
      • しかし、デバッガ起動䞭ならば「ここに蟿り着くたでに䜜成したスタックを芗き芋る」こずも可胜。
        • 巊䞋「Frames」メニュヌには、珟圚保存しおいるスタック・フレヌムが列挙されおおり、今いるスタックフレヌムが1番䞊、その䞋に「lineProcess()を呌び出す盎前のスタックフレヌムであるmain()の状態」が保存されおいる。
        • このFramesメニュヌをクリックするだけで該圓フレヌムを芳察するこずができる。

  • 䞀床デバッガを終了しよう。赀い四角ボタン
  • 甚意されおいるコヌド䟋で問題のある箇所は、ルヌプ凊理を䜕床か繰り返した埌で初めお問題が明確化する。
    • ブレヌクポむントを指定しお、そこに蟿り着くたでstep in/out実行するのはダルむ。こういう時は「ブレヌクポむントに条件を蚭定」しよう。
      • たずは珟圚蚭定しおいるブレヌクポむントを党お削陀しよう。
      • 12行目にブレヌクポむントを蚭眮。その埌、蚭眮した埌で赀䞞を「Ctrlキヌ抌しながらクリック」するず、いく぀かの条件を蚭定するこずができる。
        • ここでは「Condition」に str.equals("04/Apr/2015") == true ず入力しお、Doneしよう。これは、「盎前の行で読み蟌んだstrの倀が指定された文字列ず等しい時のみ䞀時停止しろ」ずいう条件を蚭定した䟋になっおいる。
        • 䞊蚘蚭定をしたらデバッガを起動しよう。この条件になるたで凊理が継続され、指定条件に合臎したら䞀時停止状態になっおいるはずだ。