目指せ! Webアプリケーションエンジニア

第11回アプリケーションを動かし、デバッグする

前回は、デバッグ環境の整備とアプリケーションのデプロイについて詳しく説明しました。これでアプリケーションを動かす環境が整いました。今回はWebアプリケーションサーバ上でアプリケーションを動かしデバッグする手順について、引き続きCosminexusを例にとって詳しく説明します。

アプリケーションを動かしてみる

例題アプリケーションとして、第2回第5回と同様に「Bank」アプリケーションを使用します。Bankアプリケーションでは、画面上で顧客のユーザIDと取引額を入力し[送金]ボタンをクリックすると、指定した顧客の当座預金口座から普通預金口座に、指定した金額が送金されます。口座の情報はデータベースで管理されています。

それではアプリケーションを動かしてみましょう。

①内蔵データベースを開始する

Bankアプリケーションではデータベースを使用するので、まず内蔵データベースが開始されているかどうかを確認します。プロンプトを起動し、⁠pdls」を実行します。内蔵データベースが開始されている場合は、図1のようなメッセージが表示されます。

図1 データベース開始メッセージ
図1 データベース開始メッセージ

開始されていない場合は、Windowsの[スタート]メニューの[すべてのプログラム(P)][Cosminexus][Application Development Plug-in][組み込みデータベースの開始]をクリックして開始します。

②J2EEサーバを起動しアプリケーションをデプロイする

MyEclipseの[パッケージ・エクスプローラー]ビューでBankアプリケーションを選択し、右クリックで表示されるコンテキストメニューの[デバッグ(D)][MyEclipseサーバー・アプリケーション]をクリックします。これでJ2EEサーバがデバッグモードで起動し、Bankアプリケーションがデプロイされます。

③アプリケーションを実行する

Webブラウザを起動して、次のURLを入力し、送信します。

Bankアプリケーションの初期表示画面が開きます(図2⁠⁠。ユーザIDと取引額があらかじめ表示されているので、そのまま[送金]ボタンをクリックすると送金処理が行われます。

図2 Bankアプリケーションの初期表示画面
図2 Bankアプリケーションの初期表示画面

テストとデバッグ

テストではアプリケーションの品質を高めるために、あらかじめ決めたテスト項目に従ってアプリケーションを動かし、正しい結果が得られるか確認を行います。そして正しい結果が得られるまで、不具合(バグ)を1つずつ地道に取り除いていくのです。これがデバッグです。デバッグが必要な現象として、次のようなものがあります。

結果が正しくない
【例】画面の表示がデザインと異なる、実行結果に誤りがある、など
エラーが発生する
【例】メモリ例外、プロセスのダウン、プロセスのハングアップ、など

テストは、モジュールを一つ一つ独立してテストする単体テスト、複数のモジュールを組み合わせてテストする結合テスト、システム全体をテストするシステムテストの順に進めていきます。

デバッグモードではこうやってデバッグする

一般に、単体テストや結合テストでは、デバッグモードで実行してバグを見つけます。デバッグモードでは、ブレークポイントの設定やステップ実行などを行うことができます。

次のような手順でデバッグしていきます。

  • ① 実行を止めてプログラムの状態を確認したい場所に、ソースプログラム上でブレークポイントを設定する
  • ② アプリケーションを実行する
  • ③ ブレークポイントで実行が止まるので、その時点の変数の値などを確認する
  • ④ ステップ実行で1ステップずつ進めながら、変数の値の変化を確認する

このように、意図したとおりにアプリケーションが実行されているか確認しながら、バグを特定していきます。デバッグの様子を図3に示します。

図3 デバッグ画面
図3 デバッグ画面

なお、この機能を利用するために、アプリケーションに変更を加えたり、設定を変更する必要はまったくありません。

実行モードではこうやってデバッグする

一般にシステムテストは実行モードで行います。実行モードでは、ブレークポイントの設定やステップ実行は行えません。実行モードで正しくない結果が得られたときは、Cosminexusが出力するログやスレッドダンプ、トレース情報などを活用してデバッグします。CosminexusのJava VMでは、標準のJava VMにはないログ情報や拡張されたスレッドダンプが出力され、開発者を支援します。

たとえばアプリケーションが無応答になった場合、どのようにデバッグするか見てみましょう。無応答の原因として考えられるのは次のようなケースです。

  • データベースサーバなどのバックプロセスから応答が返らない
  • アプリケーションが無限ループしている
  • デッドロックが発生している

この場合、まずスレッドダンプを取得します。スレッドダンプには各スレッドのスタックの内容が出力されます。3秒おきに10回というように、時間の経過に応じた各スレッドの状態の変化がわかるよう、複数回取得します。Cosminexusのスレッドダンプには、⁠スタックトレースのローカル変数情報⁠⁠、⁠スレッドごとのブロック回数、待ち回数⁠⁠、⁠スレッドごとのCPU消費時間」などが出力されるので、バグの特定が容易です。

それでは実際にスレッドダンプを見てみましょう(図4⁠⁠。これは3秒おきに取得したスレッドダンプのうちの2つです。

図4 スレッドダンプで無限ループの発生箇所を特定
図4 スレッドダンプで無限ループの発生箇所を特定

次のように解析していきます。

  • ① ダンプファイルを時系列に並べ、スレッドID(nid)が同じスタックトレースを比較する
  • ② 1回目のダンプと2回目のダンプからアプリケーションで使用したCPU時間の差を見ると2578msと判明。つまり、ダンプの取得間隔3秒のうち、2.6秒弱をアプリケーションで使用しており、異常に時間がかかっていることがわかる
  • ③ どちらのトレースもgetListメソッドの呼び出しまでは同じなので、getListメソッド実行中に異常が起きている可能性が高いことがわかる
  • ④ getListメソッド実行中のローカル変数iの値が想定外に増大しており、CPU使用時間と合わせて考えると、getListメソッドの実行で無限ループが発生している可能性が高いことがわかる

なお、スレッドダンプを解析する前に、トレース機能を使用して無応答が発生している個所を絞り込むと、より容易にバグを特定できます。トレース機能については、次回のアプリケーションのチューニングで詳しく説明します。

ココがポイント

今回のポイントとなるのは、以下の用語です。これらの説明ができるようにしておきましょう。

  • デバッグモード
  • ブレークポイント
  • ステップ実行
  • 実行モード
  • スレッドダンプ
Cosminexusでホッと一息 ~Cafe Cosminexus
URL:http://www.cosminexus.com

おすすめ記事

記事・ニュース一覧