0

特定の場合にフリーズする Adob​​e Flash 10 プログラムを持っていますが、Flash Player のリリース バージョンで実行している場合に限られます。デバッグ バージョンでは、アプリケーションは正常に動作します。

このような問題をデバッグする最善の方法は何ですか? コンピューターにリリース プレーヤーをインストールし、何らかの非グラフィカルな出力方法を設定しようと考えました (ログ ファイルなどを書き込む方法があると思いますか?) が、リリースととにかくインストールされたデバッグバージョン:( .

編集:わかりました、フラッシュプレーヤーのバージョンをリリースバージョンに置き換えることができ、フリーズはありませんでした...だから、これまでにわかっていることは:

Flash:     Debug   Release
Vista 32:  works   works
XP PRO 32: works*  freeze
  • これをテストするために必要なデバッグプレーヤーを彼らに渡しました

うーん、私のコードのエラーではなく、プレーヤーのバグのように見えます (すべての場合で 10.0.45.2)... 少なくとも、フリーズした時点でコールスタックを確認したいと思います。たとえば、フラッシュにlog.txtまたは問題のコードに挿入できる「トレース」のような機能を書き出すなど、さまざまなビットやピースをインストールする必要なく、それを行う方法はありますか?

EDIT2:XP 32ビットを使用している別の人にswfを渡したところ、同じ結果になりました:(

EDIT3:わかりました、flash.external.ExternalInterface.call("alert", "..."); を広範囲に使用します。問題の原因となっている正確な行を見つけることができました(例外処理コードも改善したため、フリーズするのではなく、「未処理の」例外があることがわかりました)。現在の問題は、一部のマシンのリリースプレーヤーでこれに関連するフラッシュの問題です...

particles.push(p);

上記のプラットフォームで TypeError #1034 が発生します。Particles は Vector.<Particle>、p は Particle です。getQualifiedClassName でテストしたところ、次の結果が得られました。

getQualifiedClassName(p) = ::Particle
getQualifiedClassName(particles) = __AS3__.vec::Vector.<::Particle>

これが問題である理由と、それを機能させるために何をすべきかについてのアイデアはありますか?

EDIT4:

わかりました私はこれを解決したようです。Particle クラスは、それを使用するアクション スクリプト ファイル内のパッケージ {...} の後にある単純な内部クラスです。これを独自のファイル (particle.as) に移動し、パッケージ内の適切なパブリック クラスにして、問題を解決しました。

フラッシュのバグかもしれないし、ベクターなどで内部クラスを使用しないというメモを見逃したのかもしれませんが、その場合は、(コンパイル時またはデバッグ ランタイムのいずれかで) 明示的に禁止することを期待していたでしょう。 「private varparticles:Vector.<Particle>;」のエラー ライン。機会があれば、これか何かについて Adob​​e フラッシュ チームに問い合わせてみようと思います。

元の質問の行に沿ったものだと思うデバッグのヒントを提供してくれてありがとう:)

4

2 に答える 2

2

これはロングショットですが、パーティクルはクリックしているオブジェクトですか?その場合、バブリングの間違ったフェーズでイベントをキャッチし、event.targetをプッシュすると(パーティクルであると想定)、その問題が発生する可能性があります。

問題が何であれ、私はあなたがデバッグするのを助けるべき何かを持っています。SWFに疑似トレースウィンドウを作成するクラス。JavaScriptに外部インターフェースするよりもはるかに優れています。誰が書いたか忘れてしまいましたが、セノキュラーのような気がします。エンドユーザーからトレースを取得する必要があるときはいつでも使用します。

プロジェクトのデフォルトパッケージにドロップし、stage.addChild(new Output());を呼び出してから、Output.trace( "A message");を呼び出してトレースします。

package {
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.display.GradientType;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.text.TextFieldAutoSize;

    /**
     * Creates a pseudo Output panel in a publish
     * swf for displaying trace statements.
     * For the output panel to capture trace 
     * statements, you must use Output.trace()
     * and add an instance to the stage:
     * stage.addChild(new Output());
     *
     */
    public class Output extends Sprite {
        private var output_txt:TextField;
        private var titleBar:Sprite;
        private static var instance:Output;
        private static var autoExpand:Boolean = false;
        private static var maxLength:int = 1000;

        public function Output(outputHeight:uint = 400){
            if (instance && instance.parent){
                instance.parent.removeChild(this);
            }

            instance = this;
            addChild(newOutputField(outputHeight));
            addChild(newTitleBar());

            addEventListener(Event.ADDED, added);
            addEventListener(Event.REMOVED, removed);
        }

        // public methods
        public static function trace(str:*):void {
            if (!instance) return;
            instance.output_txt.appendText(str+"\n");
            if (instance.output_txt.length > maxLength) {
                instance.output_txt.text = instance.output_txt.text.slice(-maxLength);
            }
            instance.output_txt.scrollV = instance.output_txt.maxScrollV;
            if (autoExpand && !instance.output_txt.visible) instance.toggleCollapse();
        }

        public static function clear():void {
            if (!instance) return;
            instance.output_txt.text = "";
        }

        private function newOutputField(outputHeight:uint):TextField {
            output_txt = new TextField();
            //output_txt.type = TextFieldType.INPUT;
            output_txt.border = true;
            output_txt.borderColor = 0;
            output_txt.background = true;
            output_txt.backgroundColor = 0xFFFFFF;
            output_txt.height = outputHeight;
            var format:TextFormat = output_txt.getTextFormat();
            format.font = "_sans";
            output_txt.setTextFormat(format);
            output_txt.defaultTextFormat = format;
            return output_txt;
        }

        private function newTitleBar():Sprite {
            var barGraphics:Shape = new Shape();
            barGraphics.name = "bar";
            var colors:Array = new Array(0xE0E0F0, 0xB0C0D0, 0xE0E0F0);
            var alphas:Array = new Array(1, 1, 1);
            var ratios:Array = new Array(0, 50, 255);
            var gradientMatrix:Matrix = new Matrix();
            gradientMatrix.createGradientBox(18, 18, Math.PI/2, 0, 0);
            barGraphics.graphics.lineStyle(0);
            barGraphics.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
            barGraphics.graphics.drawRect(0, 0, 18, 18);

            var barLabel:TextField = new TextField();
            barLabel.autoSize = TextFieldAutoSize.LEFT;
            barLabel.selectable = false;
            barLabel.text = "Output";
            var format:TextFormat = barLabel.getTextFormat();
            format.font = "_sans";
            barLabel.setTextFormat(format);

            titleBar = new Sprite();
            titleBar.addChild(barGraphics);
            titleBar.addChild(barLabel);
            return titleBar;
        }

        // Event handlers
        private function added(evt:Event):void {
            stage.addEventListener(Event.RESIZE, fitToStage);
            titleBar.addEventListener(MouseEvent.CLICK, toggleCollapse);
            fitToStage();
            toggleCollapse();
        }

        private function removed(evt:Event):void {
            stage.removeEventListener(Event.RESIZE, fitToStage);
            titleBar.removeEventListener(MouseEvent.CLICK, toggleCollapse);
        }

        private function toggleCollapse(evt:Event = null):void {
            if (!instance) return;
            output_txt.visible = !output_txt.visible;
            fitToStage(evt);
        }

        private function fitToStage(evt:Event = null):void {
            if (!stage) return;
            output_txt.width = stage.stageWidth;
            output_txt.y = stage.stageHeight - output_txt.height;
            titleBar.y = (output_txt.visible) ? output_txt.y - titleBar.height : stage.stageHeight - titleBar.height;
            titleBar.getChildByName("bar").width = stage.stageWidth;
        }
    }
}
于 2010-06-08T18:40:03.153 に答える
1

フリーズがいつ発生するかによって判断し、問題のあるコードの可能性を特定し、De MonsterDebuggerを使用して変数などを確認します。

編集: 実際のコール スタックは、Flash Player / AIR のデバッグ バージョンでのみ利用できると確信しています。それでも、デバッグ プレーヤーで、ボタンのハンドラー内からスタックをトレースして、何かが適切でないかどうかを確認すると便利な場合があります。

var err:Error = new Error(“An Error”);
trace(err.getStackTrace());

参考までに、getStackTrace メソッドはデバッグ プレーヤーでのみ使用できるため、本番環境で log.txt に書き込む方法はありません。

于 2010-06-07T15:50:27.563 に答える