Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.09.2016, 14:49
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 1  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,269
По умолчанию необъяснимый стектрейс

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

Старый 14.09.2016, 18:36
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 2  
Ответить с цитированием
Bletraut
[+ 22.07.15]
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 557
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Чудес не бывает. Трейсить нужно тщательнее.
__________________
Я заклинаю вас действовать иначе.

Старый 14.09.2016, 19:06
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 3  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,269
Цитата:
Сообщение от Bletraut Посмотреть сообщение
Чудес не бывает. Трейсить нужно тщательнее.
Тем не менее при возникновении стектрейса выполнение должно прерываться, а тут доходит до конца последняя строка в методе такая
Код AS3:
LoggerBox.addLog("onMU log 6");
Так вот в логе приходит такое
Цитата:
...
onMU log 6
TypeError: Error #1009
at com.rhyboo.puzzles.game::Game2/onMU()
А насчет чудес советую почитать вот этот топик.У меня до сих пор стоит условие чтоб эрор-репорт не слался от ошибки #1502 т.к. вылазит она достаточно часто в самых разных местах и никто не жалуется т.к. внешне эти ошибки никак себя не проявляют.

Старый 14.09.2016, 23:23
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Ну и ? Так ошибка очевидна вообще то : *Так вот в логе приходит такое* - значит в вашем LoggerBox и летит все к чертям после трейса
__________________
Марк Tween

Старый 14.09.2016, 23:41
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 5  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,269
Цитата:
Сообщение от in4core Посмотреть сообщение
Ну и ? Так ошибка очевидна вообще то : *Так вот в логе приходит такое* - значит в вашем LoggerBox и летит все к чертям после трейса
Причем тут логер бокс, если ошибка в методе onMU класса Game2?
Без ошибки логербокс вообщее спит и факт пришедшего репорта как раз говорит что отработал он на ура.

Старый 15.09.2016, 05:54
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,642
Записей в блоге: 4
Возможны такие варианты:
1) Используется сторонняя либа, в которой зашит блок try / catch, а в нем с блоке catch сделано так:
Код AS3:
trace(error.getStackTrace());
или  так 
trace(error.message);
2) Используются инлайны, и все по факту летит вообще в другом месте. За этим механизмом замечено, что полностью отваливаются брейкпоинты и выбросы ошибок происходят в другом месте (в смысле не на той строке, где указано. Ну, по факту конечно на той, в скомпилированном коде, но в сорсе это другая строка).

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

Старый 15.09.2016, 09:17
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 7  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,269
Цитата:
Сообщение от caseyryan Посмотреть сообщение
А вообще, покажи ка лучше свой метод. А то тут пальцем в небо гадания
Код 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");
		}
Ни инлайнов, ни сторонних либ тут нет

Старый 15.09.2016, 09:39
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Очень сложная функция (высокая цикломатическая сложность, т.е. много блоков и переходов между ними). Компилятор мог ошибочно сгенерировать код в котором неправильно указал исходную позицию в коде. Нужно смотреть дизассемблер этой функции. А еще лучше - разбить функцию на более короткие функции.
__________________
Hell is the possibility of sanity

Старый 15.09.2016, 10:35
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,642
Записей в блоге: 4
Код 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]);
			}
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 15.09.2016 в 11:04.
Старый 15.09.2016, 10:59
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 10  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,251
Записей в блоге: 6
undefined,
Была похожая проблема когда то, в чём причина так и не понял, да и не искал прям сильно, так как на работу приложения это не влияло. Выглядело так, словно любой рандомный блок кода генерировал исключение в любом месте выполнения программы. Это были и просто обработчики гуи, и циклы и загрузчики, при этом блок кода не прерывался и выполнялся как положено. Компилировалось это тогда старым sdk, который не поддерживал инлайны.
__________________
Дети не должны знать о своих родителях

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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