|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
необъяснимый стектрейс
из прода последнее время начал приходить такой стектрейс:
TypeError: Error #1009 at com.rhyboo.puzzles.game::Game2/onMU() Пытаясь, найти на какой строке в методе он вылазит, расставил запись в лог после каждой строки.И какого же было мое удивление когда в логе пришло все что должно написаться в этом методе и после последнего лога этот эрор.Т.е. метод выполняется без ошибок, а на выходе из него вылазит пакость.Cобираю с sdk Flex 4.6.0,AIR 22.0 |
|
|||||
Чудес не бывает. Трейсить нужно тщательнее.
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Тем не менее при возникновении стектрейса выполнение должно прерываться, а тут доходит до конца последняя строка в методе такая
Так вот в логе приходит такое Цитата:
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
Без ошибки логербокс вообщее спит и факт пришедшего репорта как раз говорит что отработал он на ура. |
|
|||||
Возможны такие варианты:
1) Используется сторонняя либа, в которой зашит блок try / catch, а в нем с блоке catch сделано так: 2) Используются инлайны, и все по факту летит вообще в другом месте. За этим механизмом замечено, что полностью отваливаются брейкпоинты и выбросы ошибок происходят в другом месте (в смысле не на той строке, где указано. Ну, по факту конечно на той, в скомпилированном коде, но в сорсе это другая строка). А вообще, покажи ка лучше свой метод. А то тут пальцем в небо гадания
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
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"); } |
|
|||||
Modus ponens
|
Очень сложная функция (высокая цикломатическая сложность, т.е. много блоков и переходов между ними). Компилятор мог ошибочно сгенерировать код в котором неправильно указал исходную позицию в коде. Нужно смотреть дизассемблер этой функции. А еще лучше - разбить функцию на более короткие функции.
__________________
Hell is the possibility of sanity |
|
|||||
if (groupCont.contains(sel_group[i])) groupCont.removeChild(sel_group[i]); if (sel_group[i]) pieceCont.addChild(sel_group[i]); Кстати, проверка contains тоже не самый лучший вариант. Лучше проверяй поле parent. И еще, за массивами замечено, то если удаляешь что-то из них в цикле, то это что-то может не удалиться сразу. После этого добавив что-то, ты задублируешь ссылку, а потом одна из них удалится. Какая именно не известно. А вот это что за фигня? 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; Это так задумано что ли? Или это опечатка? Уверен, что тут может падать) Вряд ли sel_group всегда совпадает с old_group до последнего индекса И еще. Что ты пытаешься здесь сделать? Зачем там проверка if (sel_group[i]) ? То есть ты пытаешься сначала этот объект откудато удалить (хотя по твоей же логике он может быть null) и только после этого проверяешь а не null ли он? И зачем его удалть откуда-то, а потом снова добавлять? Метод addChild уже и так подразумевает удаление из любого другого контейнера
__________________
Ко мне можно и нужно обращаться на ты) Последний раз редактировалось caseyryan; 15.09.2016 в 11:04. |
|
|||||
undefined,
Была похожая проблема когда то, в чём причина так и не понял, да и не искал прям сильно, так как на работу приложения это не влияло. Выглядело так, словно любой рандомный блок кода генерировал исключение в любом месте выполнения программы. Это были и просто обработчики гуи, и циклы и загрузчики, при этом блок кода не прерывался и выполнялся как положено. Компилировалось это тогда старым sdk, который не поддерживал инлайны.
__________________
Дети не должны знать о своих родителях |
Часовой пояс GMT +4, время: 12:58. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|