代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

调试仅限版本的闪存问题

  •  0
  • Fire Lancer  · 技术社区  · 15 年前

    我有一个adobeflash10程序,在某些情况下会冻结,但是只有在flashplayer的发行版下运行时才会冻结。对于调试版本,应用程序运行良好。

    调试此类问题的最佳方法是什么?我考虑在我的计算机上安装release player,并尝试设置某种非图形化的输出方法(我想有某种方法可以编写日志文件或类似的?),但是我认为无论如何都没有办法同时安装release和debug版本:(。

    编辑:好的,我设法用发行版替换了我的flash player版本,没有冻结…所以到目前为止我知道的是:

    Flash:     Debug   Release
    Vista 32:  works   works
    XP PRO 32: works*  freeze
    

    嗯,看起来越来越不像是我代码中的错误,更像是播放器中的bug(所有情况下都是10.0.45.2)。。。至少我想在调用堆栈冻结时看到它。有什么方法可以做到这一点,而不需要他们安装各种各样的位和块,例如让flash写一个log.txt或类似于“trace”的函数,我可以插入到有问题的代码中?

    EDIT2:我刚刚把swf给了另一个32位XP的人,结果是一样的:(

    编辑3: 通过广泛使用flash.external.ExternalInterface.call(“alert”,“…”);我设法找到了导致问题的确切行(我还改进了异常处理代码,因此它没有冻结,而是告诉我有一个“未处理的”异常)。现在的问题是究竟是什么问题,这与释放播放器在一些机器上。。。

    particles.push(p);
    

    在上述平台上会导致一个类型错误#1034。粒子是矢量。<粒子>,p是粒子。我用getQualifiedClassName进行了测试,得到:

    getQualifiedClassName(p)=::粒子
    getQualifiedClassName(粒子)=\uu AS3 \uuu.vec::Vector。<::粒子>

    你知道为什么这是一个问题吗?怎么做才能让它起作用?

    好吧,我好像已经解决了这个问题。粒子类只是一个简单的内部类,位于使用它的动作脚本文件中的包{…}之后。我把它移到它自己的文件(particle.as)中,并在我的包中使它成为一个适当的公共类,问题就解决了。

    也许这是一个flash错误,也许我错过了关于不在向量中使用内部类之类的备忘录,尽管如果是这样的话,我会期望某些东西(无论是在编译时还是在调试运行时)显式地禁止它,例如“private var”上的一些错误particles:Vector.<粒子>;“线路。如果有机会的话,我想我会联系一下adobeflash团队。

    感谢您提供调试提示,我猜这是更多的沿着原来的问题:)

    2 回复  |  直到 10 年前
        1
  •  1
  •   Mark L    15 年前

    根据冻结发生的时间判断,试着找出一些可能的问题代码,并使用 De MonsterDebugger 检查变量等。

    编辑: 我非常确定,实际的调用堆栈只在flashplayer/AIR的调试版本中可用。不过,在debug player中,从按钮的处理程序中跟踪堆栈以查看是否有任何不合适的地方可能还是有用的:

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

    仅供参考getStackTrace方法仅在调试播放器中可用,因此无法在生产环境中将其写入log.txt。

        2
  •  2
  •   Mark L    15 年前

    只需将其放入项目的默认包中,调用stage.addChild(new Output());,然后跟踪call Output.trace(“消息”);

    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;
            }
        }
    }