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

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

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

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
А вот это что за фигня?
Там смысл такой:
Юзер тащит кусок пазла из n кусочков (массив sel_group)
этот массив кешируется в old_group
Дальше после отпускания группы, она может слипнуться с другой группой кусков(т.е. в sel_group добавятся еще куски из присоединенной группы) и код
Код 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;
сначала выставляет false всем кускам новой объединенной группе и потом у той группы, что юзер отпустил выставляется true.Т.е. false остается у кусков, которые присоединились к группе после отпускания мыша.Дальше эти свежеприсоединенные куски выравниваются относительно отпущенной группы.Я знаю это достаточно костыльно, но зато не надо лишний раз дергать рекурсивную функцию getConnected
Цитата:
И зачем его удалть откуда-то, а потом снова добавлять? Метод addChild уже и так подразумевает удаление из любого другого контейнера
А потому что были замечены артефакты в виде непонятных черных прямоугольников на месте откуда DO по идеи должен был удалиться бы.Ручное удаление исправило это.Лишнее усливие надо удалить.
Вообщем еще раз повторяю этот код выполняется от начала и до конца т.к. последняя строка
Код AS3:
LoggerBox.addLog("onMU log 6");
Не зависит ни от каких условий и исполняется, значит и все что выше тоже исполняется без косяков.
Цитата:
Выглядело так, словно любой рандомный блок кода генерировал исключение в любом месте выполнения программы.
А тут как раз всегда один и тот же метод и один и тот же эрор.Вообщем хз,видимо придется смириться.

Старый 15.09.2016, 23:52
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 12  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Да нет тут ничего загадочного. Ошибка в первой же строке функции, когда e===null. Скорее всего, метод где-то явно вызывается (может даже и в кадре) передавая null. Хотя и через всякие onMU.bind(null, [null]) в качестве слушателя тоже можно добиться подобного.

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

В пользу версии говорит и улика в виде загадочного
Код AS3:
if (e)
  LoggerBox.addLog(some.long.message);
Загадочный if потому, что в этой строчке e уже точно не null. Ведь в начале метода идет доступ к e.target. И этот доступ падает с ошибкой в слуае e===null (что мы собственно и наблюдаем в рассматриваемой ситуации). Зато улика говорит нам, что раз есть проверка, значит автор кода явно подозревал наличие вызова onMU(null), а может, и сам написал этот вызов.

Всё сходится. Где-то есть вызов onMU(null), который и дает ошибку в логе. Лог успешного выполнения ни при чем и демонстрирует успешное выполнение функции при e!==null.

Старый 16.09.2016, 01:49
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 13  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Пакость происходит не "на выходе из него", а на "в процессе выполнения следующего вызова метода".
Согласен, это объясняет лог,вот только я прошелся поиском по всему классу единственное,где встречается onMU - подписка/отписка на маусивенты,наружу ссылка на метод тоже не передается. Проверку if(e) была поставлена на автомате,не глядя на сигнатуру метода, чтоб точно знать что запись в лог не сломает все(это же все в проде).Такое ощущение, что где-то внутрях avm между созданием ивента и передачей его в обработчик, ивент грохает мусорщик.
Цитата:
Хотя и через всякие onMU.bind(null, [null]) в качестве слушателя тоже можно добиться подобного.
А можно по подробнее что это за конструкция и что она делает?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Что будет если вызов этого метода обернуть в try / catch?
Если поймает исключение, можно будет посмотреть весь стек вызовов и проверить каждый объект null.

Второй вариант - расставь по всему методу, на каждой строчке брейкпоинты и отследи вызов каждой строчки до того момента, как вылетит этот баг.
Вообще, не знаю как получилось, что ты так долго в одном методе ищешь ошибку. Есть же отладчики / профайлеры.
Я бы понял, если бы баг происходил где-то в непонятном месте во всем приложении. Но тут он локализован до одного метода. Поиск сводится к простым "брякам"
__________________
Ко мне можно и нужно обращаться на ты)

Старый 16.09.2016, 14:02
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 15  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Что будет если вызов этого метода обернуть в try / catch?
В том то и дело что вызова метода нет
Цитата:
единственное,где встречается onMU - подписка/отписка на маусивенты,наружу ссылка на метод тоже не передается
Цитата:
Вообще, не знаю как получилось, что ты так долго в одном методе ищешь ошибку
Цитата:
из прода последнее время начал приходить такой стектрейс:
У меня то это не вылазит никогда

Старый 21.09.2016, 22:30
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 16  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Сообщение от undefined Посмотреть сообщение
Согласен, это объясняет лог,вот только я прошелся поиском по всему классу единственное,где встречается onMU - подписка/отписка на маусивенты,наружу ссылка на метод тоже не передается.
Значит я не угадал. Но это не отменяет факта, что у вас логирование с середины метода начинается. Там и промежуточные методы вызвыаются (теоретически могут вернуть null). И к каким-то глобальным переменным доступ идет. Начните логирование с самой первой строчки метода, мало ли что выяснится. Ну или хотя бы подтвердится, что метод ниоткуда не вызывается, а ошибка выводится.

Цитата:
Сообщение от undefined Посмотреть сообщение
А можно по подробнее что это за конструкция и что она делает?
Если я с синтаксисом не напутал, то конструкция называется вызов метода.Она вызывает метод. В аргументах там передается литерал массива (array literal), он создает массив . Семантика метода bind - частичное применение функции (partial application), в данном случае применение к одному аргументу null. Данный вызов bind вернет функцию, которая при вызове будет вызывать onMU(null).

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

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Там и промежуточные методы вызвыаются
ну тогда и стектрейс в этих методах был бы,а судя по логу, глубина стектрейса =1

Добавлено через 7 минут
хотя да,надо добавить логов

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Кстати, вот только что пришло в голову. У меня как-то раз, по неопытности, вылетал почти такой же странный баг, который я долго не мог отловить. Так же вылетало обращение к свойству null, хотя проверки показывали, что в методе все ок.
Как потом оказалось, дело было в том, что ошибка вылетала в экземпляре, который уже был удален, но не достаточно хорошо зачищен от ссылок. Он продолжал существовать в памяти и работать. Но так как часть ссылок там была null, это и вызывало сбои.
Что у тебя это за класс? Уж не создается ли он случаем при каждом новом уровне?
И если создается, как ты его зачищаешь от ссылок?
__________________
Ко мне можно и нужно обращаться на ты)

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

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Что у тебя это за класс? Уж не создается ли он случаем при каждом новом уровне?
Игровой класс, создается на каждой новой игре.Сейчас проверил - отписки все стоят.Ладно посмотрим что новые логи покажут.

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

Регистрация: Oct 2006
Сообщений: 2,281
действительно, стектрейс вылетает где-то до первой записи в лог.Всем спасибо, пойду копать.

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

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

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


 


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


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