Отладка выпуска только флэш-проблема - PullRequest
0 голосов
/ 07 июня 2010

У меня есть программа Adobe Flash 10, которая в некоторых случаях зависает, но только при работе с выпущенной версией флэш-плеера. С отладочной версией приложение работает нормально.

Каковы наилучшие подходы к устранению таких проблем? Я подумал об установке проигрывателя релизов на мой компьютер и попытался установить какой-то неграфический метод вывода (я думаю, что есть какой-то способ записать файл журнала или что-то подобное?), Однако я не вижу способа получить и релиз, и Все равно отладочные версии установлены :(.

РЕДАКТИРОВАТЬ: Хорошо, мне удалось заменить мою версию флеш-плеера на версию релиза, и я не зависал ... так что я знаю пока:

Flash:     Debug   Release
Vista 32:  works   works
XP PRO 32: works*  freeze
  • Я дал им отладочные плееры, которые я должен был протестировать

Хм, все меньше и меньше похоже на ошибку в моем коде и больше похоже на ошибку в плеере (10.0.45.2 во всех случаях) ... По крайней мере, id хотел бы видеть колл-стэк в той точке, где он зависает. Есть ли какой-то способ сделать это, не требуя от них установки различных частей, например, позволив flash записать log.txt или что-то подобное функции «trace», которую я могу вставить в рассматриваемый код?

EDIT2: я только что передал swf другому человеку с XP 32bit, такие же результаты: (

EDIT3: Хорошо, благодаря широкому использованию flash.external.ExternalInterface.call ("alert", "..."); Мне удалось найти точную строку, вызывающую проблему (я также улучшил код обработки исключений, поэтому вместо того, чтобы заморозить его, мне сказали, что существует «необработанное» исключение). Проблема теперь в том, что, черт возьми, мигает проблема с этим с выпуском плеера на некоторых машинах ...

particles.push(p);

Что вызывает ошибку TypeError # 1034 на указанных платформах. Частицы - это вектор. , р - частица. Я протестировал с getQualifiedClassName и получил:

getQualifiedClassName (p) = :: Particle
getQualifiedClassName (частицы) = __AS3 __. vec :: Vector. <:: Particle>

Есть идеи, почему это проблема и что нужно сделать, чтобы она работала?

EDIT4:

Хорошо, похоже, я решил это. Класс Particle - это простой внутренний класс, расположенный после пакета {...} в файле сценария действия, в котором он используется. Я переместил это в его собственный файл (частицы.as) и сделал его соответствующим публичным классом в моем пакете, и проблема решена.

Может быть, это ошибка во флэш-памяти или я пропустил заметку о том, что я не использую внутренние классы в векторах или что-то в этом роде, хотя в этом случае я бы ожидал, что что-то или другое (во время компиляции или во время выполнения отладки) явно запретит это например, какая-то ошибка в "частном var частиц: Vector. ;" линия. Если у меня появится возможность, я думаю, что я обращусь к контактной группе Adobe по поводу этого или чего-то еще.

Спасибо за помощь в предоставлении советов по отладке, которые, я думаю, больше соответствуют оригинальным вопросам:)

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

Это длинный выстрел, но являются ли частицы объектами, на которые вы нажимаете? Если это так, то перехват события в неправильной фазе барботирования и нажатие на 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;
        }
    }
}
1 голос
/ 07 июня 2010

Судя по моменту замораживания, попытайтесь определить некоторые возможности того, каким может быть код, вызывающий нарушение, и используйте De MonsterDebugger для проверки переменных и т. Д.

EDIT: Я почти уверен, что реальный стек вызовов доступен вам только в отладочных версиях Flash Player / AIR. Тем не менее, в проигрывателе отладки может быть полезно отследить стек из обработчика для кнопки, чтобы увидеть, не находится ли что-то не на своем месте:

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

К вашему сведению, метод getStackTrace доступен только в проигрывателе отладки, поэтому нет возможности записать его в log.txt при производстве.

...