Adobe
マクロメディア Flex の RIA (Rich Internet Application) アーキテクチャは、マクロメディア Flash Player のパワーと高い普及率を生かして、リッチで魅力的なインターネットアプリケーションを実現します。 Flex の登場により、 RIA 開発はこれまでになく簡単になりました。しかし開発者にとっては、クライアントの Flash Player で動作する ActionScript コードのデバッグが新たな課題となっています。
この記事では、クライアントサイド Flex アプリケーションのデバッグに必要なコンポーネントについて、そのインストールと設定手順を紹介します。また、クライアントで動作するアプリケーションをシンプルかつ効率よくデバッグする便利な方法を解説します。
Flex の RIA 開発アーキテクチャでは、アプリケーションをデバッグするいくつかの手段が用意されています。例えば Flex サーバーは、リモートオブジェクト呼び出しや Web サービス呼び出し、 HTTP リクエストをデバッグする豊富な機能を備えています。また Flex では、 AMF (Action Message Format) デバッグゲートウェイを利用して、 AMF による Flash Remoting 呼び出しのデバッグが可能です。さらには、 SWF ムービーの詳細なパフォーマンスチューニングのための SWF プロファイラーも利用できます。こうしたデバッグ機能のうち、この記事では Flex が生成した SWF ムービーをデバッグするテクニックにフォーカスして説明します。
この記事は2004年3月15日公開の英文記事の翻訳です。内容には、現状にそぐわない記述、リンク切れ、環境要件が古いものが含まれていることがありますので、ご了承下さい。
このチュートリアルでは、次のソフトウェアやファイルをインストールする必要があります。
Flex のコマンドライン ActionScript デバッガ (fdb) では、デバッグ情報を ログ出力する手段として Flash Debug Player を利用します。そこで以下、 Flash Debug Player を設定してデバッグ環境を構築する手順を説明します。
まずは、開発に用いるブラウザにインストールされた Flash Debug Player のバージョンを確かめます。以下の Flash ムービーは、お手元のブラウザで動作している Flash Player のバージョンを表示するためのものです。右下にある「 I 」をクリックし、表示される情報をスクロールダウンして、以下に示す Flash Debug Player のバージョン情報を確認してください。
この Flash ムービーでは、標準の Flash Player の場合は「 isDebugger:false 」、 Flash Debug Player の場合は「 isDebugger:true 」と表示します。 Flex では、バージョン 7,0,14,112 以降の Flash Debug Player が必要です。この条件に合致する Flash Debug Player がインストール済みであれば、以降の説明をスキップして「 Flash Debug Player の設定」セクションに進んでください。
インストールされていなければ、いまブラウザにインストールされている標準の Flash Player をアンインストールする必要があります。そのためには、 {flex.rootdir}/bin ディレクトリにある Flash アンインストールユーティリティ ( ファイル名 uninstall_flash_player.exe) を実行します。なおここで、 {flex.rootdir} とは Flex のインストール先ディレクトリを表します。通常 Windows では、同ユーティリティは C:\Program Files\Macromedia\Flex\bin に配置されます。
つづいて、 /bin ディレクトリにある Flash Debug Player をインストールします。 Internet Explorer の場合は ActiveXインストーラ ( ファイル名 Install Flash Player 7 AX.exe) を実行し、それ以外のブラウザ (Opera や Mozilla など)の場合は Flash プラグインインストーラ ( ファイル名 Install Flash Player 7.exe) を実行してください。
注: Flash Debug Player は、 Windows XP および Windows 2000 対応の Flex にのみ付属しています。 Linux 版は今年後半にリリースの予定です。
Flash Debug Player は、エラーやトレースの情報をログファイルに出力するエラーレポート機能を備えます。デフォルト設定では、同プレイヤーが動作するローカルマシンに flashlog.txt というファイル名でログを保存します。この Flash Debug Player のエラーレポート機能を正しく動作させるには、環境変数 HOMEDRIVE および HOMEPATH が示す場所が読み書き可能である必要があります。 Windows 2000 マシンや Windows XP マシンでは多くの場合、 HOMEDRIVE はシステムディスクのある C ドライブを、そして HOMEPATH はホームディレクトリのある \Documents and Settings\ <ユーザー名> をそれぞれ指しているはずです。
ただし、 Windows ドメイン設定やローカル設定の違いにより、 これらの環境変数の値が異なるか、設定せれていないことがあります。その場合は、各変数に値を設定してください。 Windows における環境変数の設定方法を以下に示します。
環境変数 HOMEDRIVE および HOMEPATH の値が変わらない場合は、管理者に依頼して、読み書き可能なアクセス権を持つ場所にこれらの変数を設定してもらう必要があります。
Flash Debug Player のエラーレポート機能を動作させるには、 Flash デバッグ設定ファイルを作成します。 mm.cfg という名称のファイルを作成し、 HOMEDRIVE および HOMEPATH が指す場所 ( 例えば c:\Documents and Settings\ <ユーザー名> \mm.cfg など ) に置きます。この mm.cfg ファイルには、以下のような設定を記述して、デフォルトのエラーおよびトレースログ機能を動作させます。
TraceOutputFileEnable=1
ErrorReportingEnable=1
mm.cfg ファイルが正しい場所に配置されていないと、 flashlog.txt ファイルへのエラーメッセージ出力が働きません。なおこのログファイルは、デフォルトでは mm.cfg ファイルと同じディレクトリに作成されます。
注: Flash Debug Player では、 flashlog.txt ファイルへ出力するエラーメッセージの数を、 SWF ファイルの起動ごとに 100 件に制限しています。このデフォルト値を変更するには、 mm.cfg ファイルで MaxWarnings プロパティを指定します。以下の例では、最大数を 500 としています。
MaxWarnings=500
注: MaxWarnings=0 と指定することで、 flashlog.txt ファイルに出力するメッセージ数の制限を解除できます。
また、 TraceOutputFileName= <保存先ディレクトリ名> / <任意のファイル名> と記述することで、 flashlog.txt ファイルを任意の場所に出力できます。以下は、 c:\ の下に flexlog.log というファイル名で保存する設定例です。
TraceOutputFileName=c:\flexLog.log
Flash Debug Player では、 trace 関数 を利用することで flashlog.txt ファイルに簡単なログを出力できます。この trace 関数 は、デバッグ作業時に変数の値やその他の診断情報を flashlog.txt に記録する手段として使えます。以下の簡単な ActionScript の例では、 TestEffectHandler 関数 の中で trace 関数を呼び出しています。
function TestEffectHandler(): Void {
var counter:Number;
var tempCounter:Number = 0;;
for (counter=0; counter<5; counter++) {
tempCounter=counter+tempCounter;
trace("Counter = " + counter);
}
debugText.text = "Total Counted = " + tempCounter.toString();
}
この関数を呼び出すと、 flashlog.txt には以下のデータが書き込まれます。
trace 関数は、簡単なデータ型や情報を表示する手段としては便利なものの、モデルやツリーといった複雑なデータ構造のデバッグには不便です。そこで Flex では、こうしたデータ構造の情報を解析する手段として、 XMLObjectOutput と呼ばれるユーティリティを提供しています (Flex のドキュメントには掲載されていません ) 。このユーティリティは、 XML オブジェクト、配列、そしてその他の ActionScript オブジェクトの値や属性をトレースし、簡単な文字列データとして flashlog.txt に記録します。
XMLObjectOutput は、 XML オブジェクトを簡単な型のオブジェクトに変換する ActionScript クラスです。同クラスは Flex に付属しており、 {flex.rootdir}/extras/XMLObjectOutput ディレクトリに XMLObjectOutput.as ファイルとして配置されています。このクラスを使うには、同ファイルを Flex の user_classes ディレクトリにコピーします。デフォルトでは、 user_classes ディレクトリは {flex.rootdir}/jrun4/servers/default/flex/WEB-INF/flex/user_classes にあります。
ActionScript の中でこのユーティリティを利用するには、以下のように記述して XMLObjectOutput クラスのインスタンスを生成します。
var myDebugger:XMLObjectOutput = new XMLObjectOutput() ;
つづいて、以下のように traceObject メソッドを呼び出し、対象となるデータ構造の内容を flashlog.txtに出力します。
myDebugger.traceObject( myEmployeeModel );
例として、 MXML で記述された XML モデルを XMLObjectOutput がどのような形式で flashlog.txt に記録するのかを見てみます。
MXML による XML データは以下の通りです。
The MXML representation of XML data:
<mx:Model id="myEmployee">
<employee employeeId="5">
<firstName>John</firstName>
<lastName>Smith</lastName>
<phone>617-219-3345</phone>
</employee>
</mx:Model>
XMLObjectOutput representation of the same data
Object: [object Object]
|-- employee [object]
|-- employeeId: 5
|-- firstName: John
|-- lastName: Smith
|-- phone: 617-219-3345
このように、 XMLObjectOutput クラスを使えば、かなり複雑なスキーマを持つ XML データも詳細表示が可能です。
Flex のコマンドライン ActionScript デバッガ (fdb) を使えば、 Flash Debug Player で動作する MXML ファイルを構成する ActionScript コード全体のプロパティやふるまいをリアルタイムに表示できます。この fdb では、 ActionScript コードにブレークポイントを設定してステップ実行したり、 SWF ファイルをブラウザで動作させながらアプリケーションのトレースデータを確認したりできます。
Flex では、 ActionScript と SWC 、 MXML のリンクとコンパイルを実行するとき、コンパイル済み MXML ファイルごとに 2 つのファイルを作成します。そのうちの 1 つとして、コンパイル済み MXML ファイルに関連するクラスのクラス定義を記した< MXML ファイル名> .1 ファイルがあります。同ファイルは、 SWF の init 関数をはじめ、イベントハンドラ、その他 MXML の実装に必要な ActionScript コードを含みます。このファイルにあるイベントハンドラ以外の関数の大半にブレークポイントを設定できます。
なお、イベントハンドラへのブレークポイント設定は、オリジナルの MXML についてのみ可能です。また、 Flex が生成する 2 つ目のファイル< MXML ファイル名> .2 には、 MXML に対応するクラスについて、遅延インスタンス生成のエントリが必要に応じて記述されます。
Flex では、デバッグ用の設定を行うことで、リクエストされた MXML テンプレートに対して SWF ファイルと SWD ファイル (Flash デバッグファイル ) の両方を生成できます。この SWD ファイルは、 SWF ファイルと同じディレクトリに保存されます。 これら 2 種類のファイルが存在しない場合やどちらかが欠けている場合、 fdb で MXML テンプレートをデバッグしようとするとエラーが発生します。
Flex のデバッガを利用するときは、 Flex サーバーの設定ファイル flex-config.xml にいくつか変更を加える必要があります ( flex-config.xml ファイルは、 JRun 利用時は通常 C:\Program Files\Macromedia\Flex\jrun4\servers\default\flex\WEB-INF\flex ディレクトリにあります。ただし JRun 以外のアプリケーションサーバー利用時は、この場所は異なります ) 。Flex のデバッグ機能は、プロダクションモードを無効に設定した時にのみ動作するので、同ファイルが以下のように設定されているか確認します。
<production-mode>false</production-mode>
次に、 generate-debug-swfs タグを以下のように設定し、SWF ファイルに対応する SWD ファイルを生成するように Flex に指示します。
<generate-debug-swfs>true</generate-debug-swfs>
ちなみに、この generate-debug-swfs タグで無効に設定されている場合でも、 MXML のリクエスト URL に特定のクエリ文字列を付加することで Flex に SWD ファイルの生成を指示できます。この機能を利用するには、 flex-config.xml ファイルの process-debug-query-params タグが以下のように設定されていることを確認し、クエリ文字列のオーバーライドを有効にします。
<process-debug-query-params>true</process-debug-query-params>
このように設定しておけば、 URL に「 ?debug=true 」と付加することで、リクエストした MXML に対応する SWD ファイルが生成されます。例えば、以下のような URL を用います。
http://mymachine/flex/debugging.mxml?debug=true
fdb を起動する前に、次に説明する設定が正しく行われているか確認してください。 fdb を実行するマシンには、 JRE (Java Runtime Environment) 1.4.x がインストール済みである必要があります。まだインストールされていない場合は、 http://www.java.com にて入手してください。また、jvm.config ファイル (C:\Program Files\Macromedia\Flex\bin に格納 ) の java.home プロパティが、 JRE のインストール先ディレクトリを正しく指していることを確認してください。例えば、以下のような設定になります。
java.home=C:/j2sdk1.4.2_04
つづいて、デフォルトブラウザに Flash Debug Player がインストールされていることを確認します。
JRE と Flash Debug Player を正しくインストールすれば、 fdb を使いアプリケーションをデバッグする準備が整います。
(fdb) run http://e-apple:8100/flex-support/debug/debugmxml.mxml Attempting to launch and connect to Player using URL: http://e-apple:8100/flex-support/debug/sample.mxml Player connected; session starting. [SWF] /flex-support/debug/sample.mxml.swf - 487,496 bytes
次のステップとして、アプリケーションの MXML テンプレートに基づいてFlex サーバーが生成したファイルを確認します。 Flex が生成もしくは称したファイルを確認するには、 fdb コンソールで info sources コマンドを実行します。以下は、 explorer.mxml ファイルのデバッグ時に同コマンドを実行した例です。
(fdb) info sources sample-generated.as#2 sample.mxml#1
4. つづいてファイルにブレークポイントを設定し、 fdb 上でステップ実行します。このときアプリケーションのソースコードを表示するには、 list <ファイル名> コマンドを以下のように入力します。
(fdb) list sample.mxml
1 <?xml version="1.0" encoding="utf-8"?>
2 <mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml" width="600" height="450">
3
4 <mx:Script>
5 <![CDATA[
6
7 function TestEffectHandler(): Void {
8
9 var counter:Number;
10 var tempCounter:Number = 0;;
(fdb)
11
12 for (counter=0; counter<5; counter++) {
13 tempCounter=counter+tempCounter;
14 trace("Counter = " + counter);
15 }
16
17 debugText.text = "Total Counted = " + tempCounter.toString();
18
19 }
sample.mxml ファイルの 13 行目にブレークポイントを追加します。以下はその例です。
(fdb) break 13 Breakpoint 1 at 0x76a91: file sample.mxml, line 13
continue コマンドを実行し、関数をステップ実行しながら出力を確認します。
(fdb) continue Breakpoint 1, TestEffectHandler() at debugmxml.mxml:13 13 tempCounter=counter+tempCounter;
ここでは、サンプルの ActionScript コードのループをステップ実行し、 tempCounter オブジェクトの値を表示してみます。そのためには、 print <オブジェクト名>コマンドを入力します。以下の例では、 fdb に対して tempCounter オブジェクトの表示を指示し、つづいて step コマンド ( 短縮形は s ) でループをステップ実行しながら同オブジェクトの値を表示しています。
(fdb) print tempCounter
$1 = 0
(fdb) step
14 trace("Counter = " + counter);
(fdb) s
[trace] Counter = 0
13 tempCounter=counter+tempCounter;
(fdb) s
14 trace("Counter = " + counter);
(fdb) s
[trace] Counter = 1
13 tempCounter=counter+tempCounter;
(fdb) s
14 trace("Counter = " + counter);
(fdb) s
[trace] Counter = 2
13 tempCounter=counter+tempCounter;
(fdb) s
14 trace("Counter = " + counter);
(fdb) n
[trace] Counter = 3
13 tempCounter=counter+tempCounter;
(fdb) n
14 trace("Counter = " + counter);
(fdb) n
[trace] Counter = 4
17 debugText.text = "Total Counted = " + tempCounter.toString();
ここでは、 fdb のデバッグセッションを開始し、コードにブレークポイントを設定したり、偏すウチを確認しながらステップ実行したりする簡単な例を紹介しました。 fdb のコンソールで help コマンドを実行すれば、デバッグに利用可能なすべての機能が表示されます。また、以下の Flex オンラインドキュメントも参考にしてください。
http://livedocs.macromedia.com/flex/1/flex_docs/wwhelp/wwhimpl/js/html/wwhelp.htm
Flex におけるクライアントのデバッグ作業では、いくつかの落とし穴があることに注意してください。デバッガ利用時のいくつかの問題点や対処方法を以下に示します。

図 1. fdb での run コマンド実行時もしくは MXML ページのリクエスト時にこのウィンドウが表示されときは、サーバーの設定と URL が正しいことを確認します。
fdb のデバッグセッション開始時に「 WARNING: The Player that you are using does not support all fdb commands 」というメッセージが表示されたときは、異なるバージョンの Flash Debug Player がインストールされていることを示します。 fdb と Flash Debug Player のバージョンが合っているか確認してください。
Flex のクライアントサイドデバッグでは、 Flex 開発環境に特化した多彩なツールやテクニックを利用でき、非常に複雑なアプリケーションのデバッグも可能です。 Flash Debug Player や trace 関数によるログ出力など、 Flash Player に内蔵されたデバッグ機能を活用できます。また Flex では、 コマンドラインでのデバッグ作業を可能にする fdb や、 複雑なオブジェクト構造を表示する XMLObjectOutput など、強力なツールが新たに提供されています。これらの手段は、 RIA のデバッグ作業でとても役に立つはずです。