Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка #1502 (Выполнение сценария превысило 15 секунд) (http://www.flasher.ru/forum/showthread.php?t=210441)

illusion21 16.03.2015 10:43

Ошибка #1502 (Выполнение сценария превысило 15 секунд)
 
Добрый день.

Анализируя логи пользователей вижу периодически, что у людей вылазит Uncatched Error #1502 (Выполнение сценария превысило 15 секунд).

Никаких бесконечных циклов вроде у меня нет. Что может быть причиной ошибки и как ее отловить? Вылазит эта ошибка буквально на пустом месте.

КорДум 16.03.2015 10:46

Цитата:

Что может быть причиной ошибки
Любой код, который выполняется свыше 15 секунд.
Например кодирование/декодирование изображения.

illusion21 16.03.2015 11:06

никаких подобных процессов в том временном интервале когда возникают такие ошибки вроде как нет. Есть ли способ конкретно выяснить какой код так долго выполняется?

undefined 16.03.2015 11:15

предлагаю показать код

illusion21 16.03.2015 11:49

Цитата:

Сообщение от undefined (Сообщение 1180086)
предлагаю показать код

проект большой... огромное количество классов и тысячи строк кода... не считая подключаемых сторонних библиотек, так что предложение невыполнимо

faraday 16.03.2015 12:13

Привет, такая же проблема http://prntscr.com/6hel92 . Долго пытался бороться, но выследить так и не смог. Вознкиают иногда в функциях, в которых всего 2 строки. Есть предположение, что возникают при эмите событий в одном из хендлеров. Тоже заинтересован в разрешении проблемы.

caseyryan 16.03.2015 22:13

Возможно рекурсия происходит, переполнение стека.
Обычно если натыкался на такие мистические проблемы, потом все равно обнаруживалось, что никакой мистики нет, и проблема в коде.
Не видя кода тут больше ничего сказать нельзя

dimarik 17.03.2015 21:10

Ошибка переполнения стека отдельная. Стек ни при чем.

illusion21 28.05.2015 12:19

сейчас опять попробовал проанализировать откуда может взяться эта ошибка... смотрю лог и не вижу никакого смысла в том что я вижу:

1525.399 Network game: sync passed
1525.566 Network recieved: CMD_RETRANSLATE
1525.566 MSG_WATCH
1525.566 TIMER START
1525.881 Lobby onClientCommand, 5
1526.148 Network recieved: CMD_RETRANSLATE
1526.148 MSG_SCORE
1526.148 Network: recieved CL_KICK_STARTED, 26081, 15
1526.998 Network recieved: CMD_RETRANSLATE
1526.998 MSG_CHANGE_BALL
1527.319 catched uncaught error
1527.320 SocketClient send, 255
1527.320 SocketClient send complete
1527.320 uncaught error: Error: #1502


слева это секунды с момента начала записи лога... я вижу что код выполняется.. все впорядке... 1527.320 выполнилась отправка очередного пакета по сокету и сразу после этого шибка того что некий сценарий больше 15 секунд выполняется... Какой такой сценарий мог выполняться 15 секунд если в ту же милисекунду когда выскочила ошибка выполнялся другой код и он был успешно выполнен.

У кого-нибудь есть идеи?

illuzor 28.05.2015 12:31

Цитата:

У кого-нибудь есть идеи?
Проверьте скаутом.

illusion21 28.05.2015 15:24

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

undefined 12.06.2015 12:43

Присоединяюсь у вопросу.Думал такое невозможно,однако вижу, что по всему коду выскакивают такие гадости, и что характерно, выскакивают не в действительно ресурсоемких местах, а на всякой мелочевке.При этом совершенно не понятно как ведет себя флэшка.Видит ли юзер диалог с предложением грохнуть скрипт. Гневных фидбэков пока не поступало.

meiciuc 12.06.2015 16:09

1526.998 MSG_CHANGE_BALL
1527.319 catched uncaught error
1527.320 SocketClient send, 255
1527.320 SocketClient send complete
1527.320 uncaught error: Error: #1502

тут без вариантов - проблема в коде
я бы, не найдя сходу причин для #1502, попытался бы понять, что за ошибка приходит чуть раньше? может, она провоцирует #1502

AlexCooper 12.06.2015 17:50

Цитата:

Сообщение от undefined (Сообщение 1183500)
Присоединяюсь у вопросу.Думал такое невозможно,однако вижу, что по всему коду выскакивают такие гадости, и что характерно, выскакивают не в действительно ресурсоемких местах, а на всякой мелочевке.При этом совершенно не понятно как ведет себя флэшка.Видит ли юзер диалог с предложением грохнуть скрипт. Гневных фидбэков пока не поступало.

Могу лишь предположить, так как бага-плавающая.
1. Зависимость идет от устройства. Но последние сборки, очень редко когда вызывают какие-то накладные условия ( если брать ФлешПлеер ), скорее всего это не причина.
Первоначальным этапом фикса будет, подпись на uncatcherror и удалённое логирование с информацией об ОС, плеере и т.д. Так же проверять внедрение флеша в страницу, проверку версии плеера.

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

Решение дописать статический класс, с статус лейблами. По типу
Код AS3:

Debug.moduleEnabled(ModuleType.VIEW);
Debug.runstack.run( OperationType.LOGIN );
Debug.runstack.complete( OperationType.LOGIN );

и статистику с картой событий, статусами модулей, какие отработали, какие готовы ( можно так же отправлять на удалённый хост )

Добавлено через 6 минут
Цитата:

Сообщение от illusion21 (Сообщение 1182880)
1527.320 uncaught error: Error: #1502

больше 15 секунд выполняется... Какой такой сценарий мог выполняться 15 секунд если в ту же милисекунду когда выскочила ошибка выполнялся другой код и он был успешно выполнен.

да и смотреть нужно не позже 1512.320 все что позже, по действующим законам нашей планеты, не подходит под больше 15 сек

Добавлено через 7 минут
Цитата:

Сообщение от faraday (Сообщение 1180090)
Привет, такая же проблема http://prntscr.com/6hel92 . Долго пытался бороться, но выследить так и не смог. Вознкиают иногда в функциях, в которых всего 2 строки. Есть предположение, что возникают при эмите событий в одном из хендлеров. Тоже заинтересован в разрешении проблемы.

А у Вас, скорее всего в TweenLite либо идёт переопределние движения без TweenLite.kill[кактотам](target), что дает двойное движение, со своими онКомплитФанкшен
либо вы удаляете объект, а TweenLite его еще пытается получить. С 99% вероятностью проблема с отображением, а скорее всего с его отсутствием

Добавлено через 28 минут
да и возможно, так как вы работаете с SocketClient, проанализировать работу СокетМенеджера. Чё вы там получаете, каким образом устроен прием данных, конструкции типа
Код AS3:

while (bytes.bytesavailable) { bytesObj.writeByte(bytes.readByte()); }

ну и на крайняк, сервер быть может выдает рассинхронизированные данные.

undefined 12.06.2015 22:19

Цитата:

я бы, не найдя сходу причин для #1502, попытался бы понять, что за ошибка приходит чуть раньше?
Если б оно было вызвано предыдущей ошибкой,то предыдущий эррор лог был бы от того же юзера, однако такого не наблюдается.
Цитата:

Первоначальным этапом фикса будет, подпись на uncatcherror и удалённое логирование с информацией об ОС, плеере и т.д.
Уже сделано собственно оттуда и приходят эрор-репорты.Единственное надо добавить версию FP.
Цитата:

2. Зависимость идет от пользователя. Так как вы говорите о фидбэках, могу предположить что апп
Фидбэк шлется за счет перекидывания юзера на сайт с формой для заполнения.К флэшке этот механизм отношения не имеет

Добавлено через 2 часа 22 минуты
ну это вообще ни в какие ворота:
Цитата:

Error #1502
at com.google.analytics.data::UTMCookie/isEmpty()
at com.google.analytics.v4::Tracker/_handleCookie()
at com.google.analytics.v4::Tracker/_initData()
at com.google.analytics.v4::Tracker/trackPageview()
at com.google.analytics::GATracker/trackPageview()
at com.rhyboo.puzzles.pages::SelectorPage/hHeaderClick()
Внутри google analytics-трекера выскочил.Все больше склоняюсь к идеи, что проблема не в коде.

illusion21 13.06.2015 00:47

в своем случае решил пока попробовать игнорировать эту #1502 ошибку. При отлове uncaught error с этим кодом я просто его игнорирую и смотрю что будет дальше. И что удивительно - ничего наблюдаемого не происходит. Приложение продолжает работать без каких-либо сбоев.

undefined 13.06.2015 01:17

Цитата:

в своем случае решил пока попробовать игнорировать эту #1502 ошибку
Тоже склоняюсь к этому варианту.Странно что гугл молчит по этому поводу не иначе масонский заговор)
2 illusion21,а бильярд в твоей подписи- твоя поделка? Выглядит сильно.

illusion21 13.06.2015 01:26

Цитата:

Сообщение от undefined (Сообщение 1183523)
Тоже склоняюсь к этому варианту.Странно что гугл молчит по этому поводу не иначе масонский заговор)
2 illusion21,а бильярд в твоей подписи- твоя поделка? Выглядит сильно.

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

undefined 13.06.2015 01:58

вот собрал за полтора часа статистику у кого оно выскакивает:
Цитата:

operation system: windows 8.1 ,flash player version: WIN 17,0,0,134, browser:Chrome
operation system: windows xp ,flash player version: WIN 17,0,0,188, browser:Firefox
operation system: windows 8.1 ,flash player version: WIN 17,0,0,188, browser:Chrome
operation system: windows 7 ,flash player version: WIN 18,0,0,160, browser:Chrome
operation system: windows 7 ,flash player version: WIN 18,0,0,160, browser:Chrome
operation system: windows 8.1 ,flash player version: WIN 18,0,0,160, browser:[Unknown Browser]
operation system: windows 8.1 ,flash player version: WIN 18,0,0,160, browser:[Unknown Browser]
каких-либо корреляций не видно

Добавлено через 38 минут
illusion21,мне кажется,в твоем случае ,может быть, оно выскакивает, когда юзер пытается закрыть окошко с игрой.Выскакивает алерт с подтверждением и пока юзер на нем тупит наступает таймаут(если изначально речь об этом бильярде шла).Хотя, учитывая что огонь в камине в это время продолжает гореть, нельзя сказать, что в флэшке все умерло

AlexCooper 13.06.2015 06:09

Цитата:

Сообщение от undefined (Сообщение 1183518)
Добавлено через 2 часа 22 минуты
ну это вообще ни в какие ворота:

Внутри google analytics-трекера выскочил.Все больше склоняюсь к идеи, что проблема не в коде.

ворота помоему всё теже. Я бы лично, не стал упускать ошибку, тем более, если проект свой. Но дело ваше
Цитата:

Сообщение от AlexCooper (Сообщение 1183508)
Так как вы говорите о фидбэках, могу предположить что апп, связывается с к какой-нить АПИ, и возможно из-за не хватки прав доступа, не поститься какая-нить синхронная "хрень" ( извините что я так о вашем ПО ). Вообще м пересмотреть все подключения, если таковы имеються

Решение дописать статический класс, с статус лейблами. По типу
Код AS3:

Debug.moduleEnabled(ModuleType.VIEW);
Debug.runstack.run( OperationType.LOGIN );
Debug.runstack.complete( OperationType.LOGIN );

и статистику с картой событий, статусами модулей, какие отработали, какие готовы ( можно так же отправлять на удалённый хост )


illusion21 13.06.2015 09:58

Добавлено через 33 секунды
Цитата:

Сообщение от illusion21 (Сообщение 1183531)
Добавлено через 38 минут
illusion21,мне кажется,в твоем случае ,может быть, оно выскакивает, когда юзер пытается закрыть окошко с игрой.Выскакивает алерт с подтверждением и пока юзер на нем тупит наступает таймаут(если изначально речь об этом бильярде шла).Хотя, учитывая что огонь в камине в это время продолжает гореть, нельзя сказать, что в флэшке все умерло

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

По таймингу в логах я все же не могу понять, выше писали что ошибка могла произойти раньше (да и смотреть нужно не позже 1512.320 все что позже, по действующим законам нашей планеты, не подходит под больше 15 сек). Так если бы в пределах 1512 что-то завесило бы процесс, то весь остальной код дальше бы просто не мог вообще выполняться, насколько я понимаю.. а он успешно выполнялся... Насколько я понимаю, у флэши нет многопоточности. Если какой-то процесс завис бы на 15 секунд то зависло бы все, никакие евенты не срабатывали бы, никакие функции не выполнялись на протяжении этих самых 15 секунд. Или как?[/quote]

AlexCooper 13.06.2015 12:55

Нет, наглядный пример
Код AS3:

trace('sync call');
setTimeout( function():void { trace('async call');} , 1000 );
throw new Error('Something happened error');


undefined 13.06.2015 15:48

Цитата:

Так если бы в пределах 1512 что-то завесило бы процесс, то весь остальной код дальше бы просто не мог вообще выполняться
Думаю имелось в виду, что произошел стектрейс, приложение стало нестабильным,юзер ничего не заметил и продолжил играть и дальше эта нестабильность вылезла вот в такой таймаут.Но опять же тогда должна быть инициирующая ошибка. Чего не наблюдается.По крайней мере в моем случае.

AlexCooper 14.06.2015 18:14

Цитата:

Сообщение от undefined (Сообщение 1183554)
Но опять же тогда должна быть инициирующая ошибка. Чего не наблюдается.По крайней мере в моем случае.

То что вы её не видете, не означает что её нет. Более того, ваш результат выполнения программы, имеет инициализацию написанною неВами.

Как я уже писал
Цитата:

Сообщение от AlexCooper (Сообщение 1183508)
Решение дописать статический (что-бы иметь всегда прямую ссылку) класс, с статус лейблами. По типу
Код AS3:

Debug.moduleEnabled(ModuleType.VIEW);
Debug.runstack.run( OperationType.LOGIN );
Debug.runstack.complete( OperationType.LOGIN );

и статистику с картой событий, статусами модулей, какие отработали, какие готовы ( можно так же отправлять на удалённый хост )

Так как
Цитата:

Сообщение от illusion21 (Сообщение 1182880)
сейчас опять попробовал проанализировать откуда может взяться эта ошибка... смотрю лог и не вижу никакого смысла в том что я вижу:

1525.399 Network game: sync passed
1525.566 Network recieved: CMD_RETRANSLATE
1525.566 MSG_WATCH
1525.566 TIMER START
1525.881 Lobby onClientCommand, 5
1526.148 Network recieved: CMD_RETRANSLATE
1526.148 MSG_SCORE
1526.148 Network: recieved CL_KICK_STARTED, 26081, 15
1526.998 Network recieved: CMD_RETRANSLATE
1526.998 MSG_CHANGE_BALL
1527.319 catched uncaught error
1527.320 SocketClient send, 255
1527.320 SocketClient send complete
1527.320 uncaught error: Error: #1502

Собрал Вам небольшой пример
Код AS3:

package debug
{
        import flash.utils.Dictionary;
 
        public class ModulesGuide
        {
                public static function module(point:int, processing:Boolean):void
                {
                        if (processing) {
 
                                if ( hasFalse( point) )        {
                                        _statusMask |= point;
                                } else {
                                        // duplication enabled
                                }
 
                        } else {
 
                                if ( hasTrue( point ) ) {
                                        _statusMask ^= point;
                                } else {
                                        // duplication disabled
                                }
                        }
                }
 
                public static function getModuleLive(status:Boolean = true):Vector.<String>
                {
 
                        var links:Dictionary = route.getLinks();
 
                        var res:Vector.<String> = new Vector.<String>;
 
                        var checker:Function;
 
                        switch (status) {
                                case true:
                                        checker = hasTrue;
                                        break;
 
                                case false:
                                        checker = hasFalse;
                                        break;
                        }
 
                        for ( var key:String in links) {
 
                                if ( checker( links[key] ) ) res.push( key );
                        }
 
                        return res;
                }
 
                public static function bind(type:String):void {
                        route.bind( type );
                }
 
                public static function keyOfType(type:String):int {
                        return route.typeConvertor( type );
                }
 
                private static var _statusMask:int = 0x0;
                private static var _route:ModuleLinkages;
 
                private static function hasTrue( key: int ):* {
                        return _statusMask & key;
                }
 
                private static function hasFalse( key: int ):* {
                        return hasTrue(key) ^ key;
                }
 
                private static function get route():ModuleLinkages {
 
                        if (!_route) _route = new ModuleLinkages();
                        return _route;
                }
        }
 
}
 
import flash.utils.Dictionary;
internal class ModuleLinkages {
 
        public function ModuleLinkages() {
 
                step        = 0;
                register= 0x1;
                range        = 0x10;
 
                claster = new <int>
                        [        0x1,
                                0x2,
                                0x4,
                                0x8
                        ];
 
                linkages = new Dictionary();
        }
 
        public function getLinks():Dictionary {
                return linkages;
        }
 
        public function bind(humanIdKey:String):void {
 
                if (linkages.hasOwnProperty(humanIdKey)) {
                        throw new ArgumentError('Already reservation Key :: '+humanIdKey);
                        return;
                }
 
                linkages[humanIdKey] = newKey;
        }
 
        public function typeConvertor(type:String):int
        {
                if (linkages.hasOwnProperty( type ) ) {
                        return linkages[type];
                }
 
                return 0;
        }
 
        private function get newKey():int{
 
                var key:int = register*claster[step++];
 
                if (step == claster.length) {
                        step = 0;
                        register *= range;
                }
 
                return key;
        }
 
        private var linkages:Dictionary;       
 
        private var step:int;
        private var register:int;
        private var range:int;
        private var claster:Vector.<int>;
}

Код AS3:

package
{
        import flash.utils.getTimer;
 
        import debug.ModulesGuide;
 
        public class Debug
        {
                private static var history:Vector.<String> = new Vector.<String>;
 
                public static function lazyStartLifecycle( type:String ):void {
                        module(type,true,true);
                }
 
                public static function lazyStopLifecycle( type:String ):void {
                        module(type,false);
                }
 
                public static function reservationTypes( type:String ):void {
                        ModulesGuide.bind( type );       
                }
 
                public static function module( type:String, completeLabel:Boolean, autobind:Boolean = false ):void {
 
                        if (autobind) reservationTypes( type );
 
                        var key:int = ModulesGuide.keyOfType(type);
                        logger("Module[ "+type+" ] <"+key+"> :: "+ completeLabel);
 
                        if (key) {       
                                ModulesGuide.module
                                (        key,
                                        completeLabel
                                );
                        } else {
                                logger("Unregistered key[ "+type+" ]");
                        }
                }
 
                public static function getLifecycleLive():Array{
 
                        return rebuilder(
                                ModulesGuide.getModuleLive()
                        );
                }
 
                public static function getLifecycleDead():Array{
 
                        return rebuilder(       
                                ModulesGuide.getModuleLive(false)
                        );
                }
 
                public static function getLifecycleLiveString():String{
 
                        return rebuilder(
                                Debug.getLifecycleLive()
                        ).join("\n");
                }
 
                public static function getLifecycleDeadString():String{
 
                        return rebuilder(
                                Debug.getLifecycleDead()
                        ).join("\n");
                }
 
                public static function getHistory():String{
                        return history.join("\n");
                }
 
                public static function logger( msg:String ):void {
 
                        var msec:Number = getTimer();
                        var sec:Number = Math.floor(.001*msec);       
                                msec -= (sec*1000);
 
                        var timeFormat:String = String(sec)+'.'+String(msec);
                        var delim:String = " :: ";
 
                        history.push( timeFormat + delim + msg );
                }
 
                private static function rebuilder(obj:*):Array {
                        var res:Array = new Array();
 
                        for each(var data:* in obj) {
                                res.push(data);
                        }
                        return res;
                }
        }
}

Как пользоваться
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class SomeApp extends Sprite
        {
                public function SomeApp()
                {
                        Debug.module('module1',true,true); // начало работы модуля1
                        Debug.module('module1',false);      // конец работы модуля1
                        Debug.module('module2',false,true);// конец работы модуля2
                        Debug.module('module3',true,true); // начало работы модуля3
 
                        trace( Debug.getLifecycleLiveString() );
                        trace( Debug.getLifecycleDeadString() );
                }
        }
}

Добавлено через 4 минуты
или с предварительной резервацией имён модулей
Код AS3:

public function SomeApp2()
{
        Debug.reservationTypes( TYPE.SOMETYPE_1 );
        Debug.reservationTypes( TYPE.SOMETYPE_2 );
        Debug.reservationTypes( TYPE.SOMETYPE_3 );
 
        Debug.module( TYPE.SOMETYPE_1, true );
        Debug.module( TYPE.SOMETYPE_1, false);
        Debug.module( TYPE.SOMETYPE_2, false);
        Debug.module( TYPE.SOMETYPE_3, true);
 
        trace( Debug.getLifecycleLiveString() );
}

Добавлено через 6 минут
ну и для ленивых
Код AS3:

Debug.lazyStartLifecycle( 'SOMETYPE_1' );
Debug.lazyStopLifecycle( 'SOMETYPE_1' );

Добавлено через 8 минут
история
Код AS3:

Debug.getHistory()

вообще м я думаю разберётесь

illusion21 16.06.2015 14:23

извините за тупость... а что этот пример делает? Что он должен показать?

AlexCooper 16.06.2015 22:11

Вы можете отслеживать выполнился ли код, от участка
Код AS3:

Debug.lazyStartLifecycle( 'имя_метки1' );

до
Код AS3:

Debug.lazyStopLifecycle( 'имя_метки1' );

и в момент
Цитата:

Сообщение от illusion21 (Сообщение 1182880)
1527.319 catched uncaught error
1527.320 SocketClient send, 255
1527.320 SocketClient send complete
1527.320 uncaught error: Error: #1502

отправить на сервер число-битовую_маску ModulesGuide._statusMask
и посмотреть какие участки выполнились, а какие нет. Тем самым обнаружить, где произошло зависание.
Всё прошивать я думаю, не стоит, но как минимум путём дробления на половины, можно будет найти тот кусок кода, который ушёл в бесконечность.

illusion21 16.06.2015 23:45

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


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

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