Hatena::ブログ(Diary)

Yamashiro0217の日記 RSSフィード

2010-12-23 Eclipseデバッガ徹底解説 このエントリーを含むブックマーク

Java Advent Calendar -ja 2010 : ATND 11日目。昨日は、id:daisuke-m でした。
完全に Eclipse のこと書けとふられてる感じがしたので Eclipse について書く。



Eclipse の何について書こうかと考えたんだけど、先日、社会人になってからプログラム書き始めた弊社の若い子が、「デバッガ」の存在を知らなかったのでデバッガの基本的な使い方などについて書く。
PHPというちょっとしたWebページをさらっと書くには素晴らしい言語だけしか知らないみたいだから、あんまりデバッガ使う文化が無かった模様です。
var_dumpデバッグェ…。


今回は初心者向け記事なので、基本Java使い倒してる皆様は読まなくてよろしいが、Break Point Properties の Condition とかDrop To FrameとかExpressionの機能知らない人は読んでみる価値はあるよ!


ところで、Eclipse 記事といえば、僕の「全Eclipse Java プログラマーに捧げる Eclispe 徹底活用術完全版〜Eclipseに空気を読ませて楽する術〜」という記事は力作なので読んでくださいね。


さてデバッガとは何か。wikipediaによると、

デバッガとは、デバッグを支援するプログラムのこと。対話的に利用者がプログラムを動作させたり、プログラムが使っている変数等を表示させる機能がある。近年では統合開発環境に含まれていることが多い。また、ICEなどでは、ハードウェアと連携して動作する。

とある。まぁ、デバッグ作業などが楽になるツールだということです。そんなこと言われてもわからないだろうから、実例を見ましょう。



例えば次のようなクラスがあったとする。たとえば、このクラスの仕様が count が 0 から始まって、countUp メソッドを呼ぶことで count が増えていく仕様を期待してたとする。が、実際には、countUp を呼ぶと何故か 99 になる。これをデバッグしたいとしよう。
本当はもっと複雑なコード例を出したかったのだが、連日の忘年会で力尽きた。あとモンハンで力尽きた。




Eclipseデバッガの起動の仕方は、ツールバーにある
虫ボタンをクリックするか、右クリックの「Debug As」などから「Java Application」や「JUnit」などを選択して、Java ApplicationやJUnitのテストをデバッグ実行させる。また、EclipseからTomcatJettyなどのWebサーバーを起動することで、Webアプリケーションデバッグも出来る。また、後述するが、他のマシンで動いているWebアプリケーションなどもデバッガをつないでプログラムの挙動を見ることが出来る。


さて、デバッガ起動できただろうか?このままだと何もおきない。いや、Eclipse は Debug パークスペクティブに変わると思うが。



デバッグ作業で大事なのはブレークポイントを設定することだ。ブレークポイントとは、デバッガを起動した時に処理を止める場所のことである。
ブレークポイントの追加方法は、コードのエディタの左端をダブルクリックするか、右クリックのメニューからToggle Breakpointメニューを選択することで追加できる。



ブレークポイントはいくつでも追加できる。ただし、適切な少数のブレークポイントを設定できることは重要なスキルだ。ブレークポイントを作りすぎると、デバッグ作業がはかどらない。



さて、再度デバッガを起動してみよう。ブレークポイントで以下のような表示に
なれば成功である。



さて、止まっただけでは当然何も嬉しくはない。機能を簡単に紹介しつつデバッガを使ったデバッグ方法について解説しよう。例えば、まずこの止まってる状態で、右上のVariables Viewで値を確認してみよう。



そうすると、countの値が100になっているのが見える。まず、これでバグの原因のひとつがわかった。つづいて、なぜ99になるのか調べてみたいので、メソッドの中で何をしてるのかをデバッガで追ってみよう。Step Inという機能を使うと、メソッドの中に入ることができる。Debug Viewのボタンを押すか、ショートカットキーがF5なので、それを押すことでメソッドの中に入ることが出来る。

count-- してしまっているではないか。これがバグの原因その2である。


と、至極簡単なコードなのでありがたみがすごい分かりにくかったかもしれないが、大まかなデバッグの流れはこのようになる。



続いて、一個一個の View の詳細を解説しよう。ここであげているデバッガの機能を使い倒すことで複雑なソースでもサクサクデバッグできるようになるよー!



まず左上のDebug Viewだが、

これは、現在JVMで起動しているスレッドスタックデバッガが止まっている場所などが表示される。
今回の例ではスレッドがひとつだが、Webアプリケーションデバッグなどをすると、スレッドが複数見えることとなる。


また、マウス派には便利なResumeボタンやStep Intoボタンなどが配置されている。僕はキーボード派なのでショートカットキーを使いますが。
ボタンの説明をしよう。

  • Resume(F8)

ブレークポイントで止まっているプログラムを次のブレークボタンまで進める

  • Suspend

プログラムを止める。なんか無限ループくせぇと思ったらこの機能を使うと( ・∀・)イイ!!よ!

  • Terminate(Ctrl+F2)

デバッガの終了

  • Disconnect

リモートデバッグしてるときに、切断する…らしいよ!

  • Step Into (F5)

さっきも見せたメソッドの中に入るやつ。

  • Step Over(F6)

メソッド呼び出しをスキップして次の行まで行く。自分がデバッグしたい対象じゃないときはStep Overで。

  • Step Return(F7)

メソッドからReturnする。デバッグしてて、このメソッドはもう関係ないわー。と思ったらStep Returnで。

  • Drop To Frame

これ俺使ったことなかったんだけど、調べたら便利すぎる。左のスタックフレームを選択して、そこに戻ることが出来る!これ便利すぎるだろ…俺人生を今まで無駄にしてたわ…

  • Use Step Filters

Step Into でガスガス飛ぶときに、デバッグ対象じゃないコードに入ってしまうと非常にダルイ。特に文字列リテラルが出てくるとStringクラスのコンストラクタに入ったりして非常に人生を無駄にする。そんなときに、このFilter機能を使うと幸せになれる。
フィルタの設定は、Preferencesの [Java]-[Debug]-[Step Filtering]から出来るよ!これも知らない人多いんじゃないかな。

  • Focus on active task

これ知らなかったけど、Mylynでタスク設定したソースしか見えなくなる…のかな。便利かも。


あと矢印を押すと、メニューがいろいろ出てくるよ

  • Layout

見た目いろいろ変えられるよ!つかったことないよ!

  • View Management

Debug Viewを出すパースペクティブをいじれるよ!使ったことないよ!

Debug Viewに表示するものを増やせるよ!俺使ったことなかったんだけど、Show Monitorすれば、スレッドのMonitorの状態が見えるから、デッドロックとかのデバッグにきっと便利だよ!スレッドグループとかも出せるからきっと便利だよ!


次に、EditorのViewについて。

この緑色になっているラインが、現在、デバッガが実行して止まっている箇所を指している。Webアプリケーションなどをリモートデバッグすると、コードのバージョンが違っていて、全然違う行をさしていてハマるとかはありがちなので注意されたし。スタックフレームを他の位置選択すると、薄い緑色で表示されるよ!


次 Variables View

これは、デバッガが止まっているコンテキストで見える変数の一覧が表示される。見てわかると思うが、クラスのインスタンスだったらクラスの名前やオブジェクトid、プリミティブ型だったら値そのものが表示される。また、オブジェクトを選択肢たときには、下側にtoStringした結果が見える。


あと、これ大事な機能なのに知らない人が多いのだが、Variables Viewから、変数の値を書き換えることができる。例えばこの例でcountが100になっているが、それをデバッグの都合で0にしたいという欲求があったとする。countのValueのところでダブルクリックしてみよう。そうすると、なんか編集できそうなUIになる。



ここで値を0にして、Enterを押すと、あら不思議。値が書き換わって、その後はその値でプログラムが動くようになる。デバッガから書き換えた値は、黄色く表示される親切設計。



次 Breakpoints View

設定してあるブレークポイントの一覧が見える。ここからブレークポイントを削除したり、ブレークポイントのあるソースを開いたりできる。
一個一個コンテキストメニューを説明していこう。ちなみに、説明のために、コンテキストメニューを出しただけで、全ての操作は、このView内から出来る。例えばブレークポイントの削除はブレークポイントを選択して、「Delete」キーで削除できる。


  • Go to File

ブレークポイントのあるソースを開く

  • Suspend VM / Suspend Thread

ブレークポイントに来たときに、VMごと止めるかスレッドを止めるかの設定ができる。使った記憶はない

  • Hit Count

ループ内の処理とかをデバッグしてるときに、ループ100回目あたりの処理があやしい…とかあるあるで、ブレークポイントに100回くるまで手動で回す…とかやるのはかったるいので、HitCountというのを100と設定すれば、100回ブレークポイントまできたら初めて止めるとかができる

  • Enable / Disable

一時的にブレークポイントを利用停止とかが出来る。なんかここにバグないかも。と思ったら削除するんじゃなくて一時停止とかによくするよ。

  • RemoveとかExportとかは見ればわかるやろ

  • BreakPoint Properties

次のような画面が開いて細かい設定ができる。がEclipse Helios から、ほとんどの項目をViewから直接編集できるようになったのであまり使わない

  • Condition

これすごい大事な機能で、ある特定の条件に当てはまったりした場合だけブレークポイントを止めることが出来る。さっきもループについて書いたが、ループの中で値がある値になったときだけ動きがあやしいとかの時に使う。



最後に Expression View。

Javaの式を書いておくことで、デバッグ実行しているコンテキストで、そのJavaの式を評価した値を表示してくれる。すごい良く使う。プロパティも見えるし、メソッドも呼べる。ただし、副作用のあるようなメソッドを呼ぶときはすごい注意。それにはまった経験がある。



長い記事だった…最後のほうは割と力尽きてる感があったw
そういえば、WindowsのEclipseで、VMのCentOSのなかで動かしてるApache2+PHP5.2にXdebugでリモートデバッグできないんですが、みんなPHPデバッガ利用できてるよね???


さて、Java Advent Calendar -ja 2010 : ATND 12日目、明日は、寺田 佳央 ? Yoshio Teradaさんです。