Я действительно изо всех сил пытаюсь разрешить переполнение стека, которое я получаю. Трассировка, которую я получаю во время выполнения:
VerifyError: Error #1024: Stack underflow occurred.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
Это особенно сложно для отладки, потому что когда я работаю в режиме отладки, это вообще не происходит. Это происходит только при компиляции как релиз.
У кого-нибудь есть какие-либо советы по отладке Stack Underflow? Есть ясное объяснение того, что это значит для Flash?
В случае, если это помогает, эта ошибка возникает, когда я нажимаю кнопку, чей обработчик выполняет вызов RPC, который использует URLLoader, AsyncToken, а затем вызывает набор экземпляров AsyncResponder, связанных с AsyncToken. С некоторой регистрацией на стороне сервера, а также с регистрацией, взломанной в swf, я знаю, что UrlLoader успешно делает и GET'ing файл crossdomain.xml корректно обрабатывает его (то есть: если я уничтожаю его, я получаю защиту ошибка), а также успешно завершает запрос «загрузка» (сервер отправляет данные). Похоже, что процесс переполнения происходит в процессе прослушивания / обработки Event.COMPLETE (что, конечно, также подразумевается при трассировке).
mxmlc used = из flex_sdk_4.5.0.20967
Пример игрока (я пробовал несколько) = 10.2.153.1
ОБНОВЛЕНИЕ : Моя конкретная проблема решена ... но я оставляю вопрос как есть, так как я хотел бы знать, как вообще отладить такую проблему, а не просто получить свое конкретное решение .
В моем коде у меня было следующее определение приложения:
<s:Application height="100%" width="100%"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
initialize="InitData();">
Обратите внимание, что код прикреплен к событию initialize
.
InitData () и соответствующие определения: / 1027 *
import classes.RpcServerProxy;
public var SP:RpcServerProxy;
public function InitData():void {
SP = new RpcServerProxy("http://192.168.1.102:1234");
}
Когда я переключил вызов InitData () на событие onCompletion
вместо initialize
(спасибо J_A_X!), Проблема полностью исчезла. Кажется, что происходило то, что обработчик события Event.COMPLETE (onComplete в трассировке стека) использовал глобальный объект SP. Что-то в компиляции release (vs debug) должно было повлиять на время запуска инициализации переменной SP. Перемещение обработчика позже к событию onCompletion
решило все проблемы.
Как уже было сказано выше, я все же хотел бы знать, какие хитрости / инструменты доступны для устранения подобных проблем инициализации.
ОБНОВЛЕНИЕ 2:
applicationComplete
представляется даже лучшим событием, чем creationComplete
для добавления кода инициализации приложения. См. эту запись в блоге для некоторых пояснений и это видео (около 4:25) от Adobe Tech Evangelist для примера простой инициализации данных "запуска приложения".