前回は、デバッグ環境の整備とアプリケーションのデプロイについて詳しく説明しました。これでアプリケーションを動かす環境が整いました。今回はWebアプリケーションサーバ上でアプリケーションを動かしデバッグする手順について、引き続きCosminexusを例にとって詳しく説明します。
アプリケーションを動かしてみる
例題アプリケーションとして、第2回や第5回と同様に「Bank」アプリケーションを使用します。Bankアプリケーションでは、画面上で顧客のユーザIDと取引額を入力し[送金]ボタンをクリックすると、指定した顧客の当座預金口座から普通預金口座に、指定した金額が送金されます。口座の情報はデータベースで管理されています。
それではアプリケーションを動かしてみましょう。
①内蔵データベースを開始する
Bankアプリケーションではデータベースを使用するので、まず内蔵データベースが開始されているかどうかを確認します。プロンプトを起動し、「pdls」を実行します。内蔵データベースが開始されている場合は、図1のようなメッセージが表示されます。
開始されていない場合は、Windowsの[スタート]メニューの[すべてのプログラム(P)]-[Cosminexus]-[Application Development Plug-in]-[組み込みデータベースの開始]をクリックして開始します。
②J2EEサーバを起動しアプリケーションをデプロイする
MyEclipseの[パッケージ・エクスプローラー]ビューでBankアプリケーションを選択し、右クリックで表示されるコンテキストメニューの[デバッグ(D)]-[MyEclipseサーバー・アプリケーション]をクリックします。これでJ2EEサーバがデバッグモードで起動し、Bankアプリケーションがデプロイされます。
③アプリケーションを実行する
Webブラウザを起動して、次のURLを入力し、送信します。
Bankアプリケーションの初期表示画面が開きます(図2)。ユーザIDと取引額があらかじめ表示されているので、そのまま[送金]ボタンをクリックすると送金処理が行われます。
テストとデバッグ
テストではアプリケーションの品質を高めるために、あらかじめ決めたテスト項目に従ってアプリケーションを動かし、正しい結果が得られるか確認を行います。そして正しい結果が得られるまで、不具合(バグ)を1つずつ地道に取り除いていくのです。これがデバッグです。デバッグが必要な現象として、次のようなものがあります。
- 結果が正しくない
- 【例】画面の表示がデザインと異なる、実行結果に誤りがある、など
- エラーが発生する
- 【例】メモリ例外、プロセスのダウン、プロセスのハングアップ、など
テストは、モジュールを一つ一つ独立してテストする単体テスト、複数のモジュールを組み合わせてテストする結合テスト、システム全体をテストするシステムテストの順に進めていきます。
デバッグモードではこうやってデバッグする
一般に、単体テストや結合テストでは、デバッグモードで実行してバグを見つけます。デバッグモードでは、ブレークポイントの設定やステップ実行などを行うことができます。
次のような手順でデバッグしていきます。
- ① 実行を止めてプログラムの状態を確認したい場所に、ソースプログラム上でブレークポイントを設定する
- ② アプリケーションを実行する
- ③ ブレークポイントで実行が止まるので、その時点の変数の値などを確認する
- ④ ステップ実行で1ステップずつ進めながら、変数の値の変化を確認する
このように、意図したとおりにアプリケーションが実行されているか確認しながら、バグを特定していきます。デバッグの様子を図3に示します。
なお、この機能を利用するために、アプリケーションに変更を加えたり、設定を変更する必要はまったくありません。
実行モードではこうやってデバッグする
一般にシステムテストは実行モードで行います。実行モードでは、ブレークポイントの設定やステップ実行は行えません。実行モードで正しくない結果が得られたときは、Cosminexusが出力するログやスレッドダンプ、トレース情報などを活用してデバッグします。CosminexusのJava VMでは、標準のJava VMにはないログ情報や拡張されたスレッドダンプが出力され、開発者を支援します。
たとえばアプリケーションが無応答になった場合、どのようにデバッグするか見てみましょう。無応答の原因として考えられるのは次のようなケースです。
- データベースサーバなどのバックプロセスから応答が返らない
- アプリケーションが無限ループしている
- デッドロックが発生している
この場合、まずスレッドダンプを取得します。スレッドダンプには各スレッドのスタックの内容が出力されます。3秒おきに10回というように、時間の経過に応じた各スレッドの状態の変化がわかるよう、複数回取得します。Cosminexusのスレッドダンプには、「スタックトレースのローカル変数情報」、「スレッドごとのブロック回数、待ち回数」、「スレッドごとのCPU消費時間」などが出力されるので、バグの特定が容易です。
それでは実際にスレッドダンプを見てみましょう(図4)。これは3秒おきに取得したスレッドダンプのうちの2つです。
次のように解析していきます。
- ① ダンプファイルを時系列に並べ、スレッドID(nid)が同じスタックトレースを比較する
- ② 1回目のダンプと2回目のダンプからアプリケーションで使用したCPU時間の差を見ると2578msと判明。つまり、ダンプの取得間隔3秒のうち、2.6秒弱をアプリケーションで使用しており、異常に時間がかかっていることがわかる
- ③ どちらのトレースもgetListメソッドの呼び出しまでは同じなので、getListメソッド実行中に異常が起きている可能性が高いことがわかる
- ④ getListメソッド実行中のローカル変数iの値が想定外に増大しており、CPU使用時間と合わせて考えると、getListメソッドの実行で無限ループが発生している可能性が高いことがわかる
なお、スレッドダンプを解析する前に、トレース機能を使用して無応答が発生している個所を絞り込むと、より容易にバグを特定できます。トレース機能については、次回のアプリケーションのチューニングで詳しく説明します。
ココがポイント
今回のポイントとなるのは、以下の用語です。これらの説明ができるようにしておきましょう。
- デバッグモード
- ブレークポイント
- ステップ実行
- 実行モード
- スレッドダンプ
- Cosminexusでホッと一息 ~Cafe Cosminexus
- URL:http://www.cosminexus.com