Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   необъяснимый стектрейс (http://www.flasher.ru/forum/showthread.php?t=213351)

undefined 14.09.2016 14:49

необъяснимый стектрейс
 
из прода последнее время начал приходить такой стектрейс:
TypeError: Error #1009
at com.rhyboo.puzzles.game::Game2/onMU()
Пытаясь, найти на какой строке в методе он вылазит, расставил запись в лог после каждой строки.И какого же было мое удивление когда в логе пришло все что должно написаться в этом методе и после последнего лога этот эрор.Т.е. метод выполняется без ошибок, а на выходе из него вылазит пакость.Cобираю с sdk Flex 4.6.0,AIR 22.0

Bletraut 14.09.2016 18:36

Чудес не бывает. Трейсить нужно тщательнее.

undefined 14.09.2016 19:06

Цитата:

Сообщение от Bletraut (Сообщение 1196150)
Чудес не бывает. Трейсить нужно тщательнее.

Тем не менее при возникновении стектрейса выполнение должно прерываться, а тут доходит до конца последняя строка в методе такая
Код AS3:

LoggerBox.addLog("onMU log 6");

Так вот в логе приходит такое
Цитата:

...
onMU log 6
TypeError: Error #1009
at com.rhyboo.puzzles.game::Game2/onMU()
А насчет чудес советую почитать вот этот топик.У меня до сих пор стоит условие чтоб эрор-репорт не слался от ошибки #1502 т.к. вылазит она достаточно часто в самых разных местах и никто не жалуется т.к. внешне эти ошибки никак себя не проявляют.

in4core 14.09.2016 23:23

Ну и ? Так ошибка очевидна вообще то : *Так вот в логе приходит такое* - значит в вашем LoggerBox и летит все к чертям после трейса

undefined 14.09.2016 23:41

Цитата:

Сообщение от in4core (Сообщение 1196156)
Ну и ? Так ошибка очевидна вообще то : *Так вот в логе приходит такое* - значит в вашем LoggerBox и летит все к чертям после трейса

Причем тут логер бокс, если ошибка в методе onMU класса Game2?
Без ошибки логербокс вообщее спит и факт пришедшего репорта как раз говорит что отработал он на ура.

caseyryan 15.09.2016 05:54

Возможны такие варианты:
1) Используется сторонняя либа, в которой зашит блок try / catch, а в нем с блоке catch сделано так:
Код AS3:

trace(error.getStackTrace());
или  так
trace(error.message);

2) Используются инлайны, и все по факту летит вообще в другом месте. За этим механизмом замечено, что полностью отваливаются брейкпоинты и выбросы ошибок происходят в другом месте (в смысле не на той строке, где указано. Ну, по факту конечно на той, в скомпилированном коде, но в сорсе это другая строка).

А вообще, покажи ка лучше свой метод. А то тут пальцем в небо гадания

undefined 15.09.2016 09:17

Цитата:

Сообщение от caseyryan (Сообщение 1196160)
А вообще, покажи ка лучше свой метод. А то тут пальцем в небо гадания

Код AS3:

                private function onMU(e:MouseEvent):void {
                        if (e.target is VScroller) return;
                        if (tray)
                                addChild(tray);
                        if (!sel_group || tween) return;
                        var i:int;
                        for (i = 0; i < sel_group.length; i++) {
                                if (groupCont.contains(sel_group[i]))
                                        groupCont.removeChild(sel_group[i]);
                                        if (sel_group[i])
                                                pieceCont.addChild(sel_group[i]);
                        }
                        if (Main.special_users.indexOf("fb_" + fbm.fbId) != -1) {
                                writeToDebugPanel("left mouse up. group size:"+sel_group.length);
                                LoggerBox.addLog("group released " + sel_group.length);
                                groupCont.graphics.clear();
                        }
                        if (sel_group.length == 1) (sel_group[0] as PieceDO).stopBlink();
                        if (blinkingPiece>=0 && singlePieces[blinkingPiece]==sel_group[0])
                                blinkingPiece = -1;
                        var n_snd:uint = Math.floor(Math.random() * 3) + 1;
                        SoundManager.playSound("piece_put" + n_snd + "_snd");
                        stateChanged = true;
                        //alignConnected(sel_group[0]);
                        //ExternalInterface.call("console.log('before connect:')");
                        //showStats();
                        var p:Point;
                        if (sel_group.length>1) {
                                for (i = 0; i < sel_group.length; i++) {
                                        alignToGrid(sel_group[i] as PieceDO,false);
                                }
                                alignToGrid(sel_group[0] as PieceDO, true);
                        } else {
                                alignToGrid(sel_group[0] as PieceDO, true);
                        }
                        for (i = 0; i < sel_group.length; i++) {
                                connect(sel_group[i]);
                        }
                        //ExternalInterface.call("console.log('after connect:')");
                        //showStats();
                        var n:int = sel_group.length;
                        var firstPiece:PieceDO = sel_group[0] as PieceDO;
                        var old_group:Array = sel_group;
                        sel_group = getConnected(firstPiece);
                        if (sel_group.length>old_group.length) {
                                // mark pieces
                                for (i = 0; i < sel_group.length; i++)
                                        sel_group[i].checked = false;
                                // mark dropped pieces
                                for (i = 0; i < old_group.length; i++)
                                        sel_group[i].checked = true;
                                //alignConnected(firstPiece);
                                // allign newly connected pieces to already connected part
                                for (i = 0; i < sel_group.length; i++) {
                                        if (!sel_group[i].checked) {
                                                alignConnected(sel_group[i]);
                                                break;
                                        }
                                }
                        } else {
                                alignConnected(firstPiece);
                        }
                        old_group = null;
                        findSinglePieces();
                        dispatchEvent(new AppEvent("search_panel_state_changed", getSearchPanelState()));
                        var ev:AppEvent;
                        fromTray = false;
                        //dispatchEvent(new AppEvent("piece released"));
                        if (n != sel_group.length) {
                                ev = new AppEvent("connected");
                                dispatchEvent(ev);
                                SoundManager.playSound("merge_snd",false);
                                lastMoveData = null;
                        }
                        LoggerBox.addLog("onMU log 1:"+n+","+sel_group.length+","+blink);
                        if (n != sel_group.length && blink) {
                                for (i = 0; i < sel_group.length; i++) {
                                        if (sel_group[i].parent != pieceCont) {
                                                sel_group[i].parent.removeChild(sel_group[i]);
                                                pieceCont.addChild(sel_group[i]);
                                        }
                                }
                                BlinkManager.blink(sel_group);
                        }
                        LoggerBox.addLog("onMU log 2,event:" + e+",this:" + this + ",sel_group:" + sel_group.length);
                        if (e)
                                LoggerBox.addLog("onMU log 3,target==stage?:" +(e.currentTarget==stage)+",n*m:"+(this.n * this.m)+"skipCompleted:"+skipCompleted);
                        if (sel_group.length == (this.n * this.m) && this.mouseEnabled && e.currentTarget != stage && !skipCompleted) {
                                LoggerBox.addLog("last piece connected");
                                ev = new AppEvent("gameover");
                                dispatchEvent(ev);
                                //e.stopImmediatePropagation();
                                skipCompleted = true;
                                if (zoomTween)  zoomTween.fforward();
                                zoomParams = { startZoom:zoom, endZoom:field_scale};
                                scaleFactor = 1;
                                zoom = field_scale;
                                zoomTween=new Tween(null,"",None.easeNone,0,1,0.3,true);
                                zoomTween.addEventListener(TweenEvent.MOTION_CHANGE,zoomAnim);
                                zoomTween.start();
                        }
                        LoggerBox.addLog("onMU log 4");
                        sel_group = null;
                        LoggerBox.addLog("onMU log 5");
                        this.removeEventListener(Event.ENTER_FRAME, onEF);
                        LoggerBox.addLog("onMU log 6");
                }

Ни инлайнов, ни сторонних либ тут нет

wvxvw 15.09.2016 09:39

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

caseyryan 15.09.2016 10:35

Код AS3:

if (groupCont.contains(sel_group[i]))
                                        groupCont.removeChild(sel_group[i]);
                                        if (sel_group[i])
                                                pieceCont.addChild(sel_group[i]);

Очень плохая привычка. У тебя тут отступ, как-будто второй if вложен в первый, а по факту это два независимых блока. Но это вообще относится ко всему коду. Тут простор для багов просто огромный.
Кстати, проверка contains тоже не самый лучший вариант. Лучше проверяй поле parent.
И еще, за массивами замечено, то если удаляешь что-то из них в цикле, то это что-то может не удалиться сразу. После этого добавив что-то, ты задублируешь ссылку, а потом одна из них удалится. Какая именно не известно.

А вот это что за фигня?
Код AS3:

for (i = 0; i < sel_group.length; i++)
                                        sel_group[i].checked = false;
                                // mark dropped pieces
for (i = 0; i < old_group.length; i++)
                sel_group[i].checked = true;

Во втором цикле ты задаешь checked = true объекту, находящемуся в sel_group, а перебираешь old_group.
Это так задумано что ли? Или это опечатка? Уверен, что тут может падать) Вряд ли sel_group всегда совпадает с old_group до последнего индекса

И еще. Что ты пытаешься здесь сделать? Зачем там проверка if (sel_group[i]) ?
То есть ты пытаешься сначала этот объект откудато удалить (хотя по твоей же логике он может быть null) и только после этого проверяешь а не null ли он?
И зачем его удалть откуда-то, а потом снова добавлять? Метод addChild уже и так подразумевает удаление из любого другого контейнера
Код AS3:

for (i = 0; i < sel_group.length; i++) {
                                if (groupCont.contains(sel_group[i]))
                                        groupCont.removeChild(sel_group[i]);
                                        if (sel_group[i])
                                                pieceCont.addChild(sel_group[i]);
                        }


Tails 15.09.2016 10:59

undefined,
Была похожая проблема когда то, в чём причина так и не понял, да и не искал прям сильно, так как на работу приложения это не влияло. Выглядело так, словно любой рандомный блок кода генерировал исключение в любом месте выполнения программы. Это были и просто обработчики гуи, и циклы и загрузчики, при этом блок кода не прерывался и выполнялся как положено. Компилировалось это тогда старым sdk, который не поддерживал инлайны.


Часовой пояс GMT +4, время: 01:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.