Я действительно пытаюсь решить проблему стека, которую я получаю. След, который я получаю во время выполнения:
VerifyError: Error #1024: Stack underflow occurred. at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete()
Это особенно сложно отлаживать, потому что, когда я запускаю режим отладки, этого не происходит вообще. Это происходит только при компиляции в виде выпуска.
Есть ли у кого-нибудь советы о том, как отлаживать стекирование под потоком? Есть ли чистое объяснение того, что это значит для Flash?
В случае, если это помогает, эта ошибка возникает, когда я нажимаю кнопку, чей обработчик выполняет вызов RPC, который использует URLLoader, AsyncToken, а затем вызывает набор экземпляров AsyncResponder, связанных с AsyncToken. С некоторыми протоколами на стороне сервера, а также с некоторыми протоколами, взломанными в swf, я знаю, что UrlLoader успешно выполняет и GET'ing файл crossdomain.xml, правильно обрабатывает его (то есть: если я его обману, я получаю защиту ошибка), а также успешно завершает запрос "load" (сервер отправляет данные). Как представляется, процесс underflow происходит в процессе прослушивания/обработки Event.COMPLETE(как, конечно, подразумевается также трассировка).
mxmlc used = from 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() и соответствующие defintions являются/были:
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 Евангелист за примером простой инициализации данных "запуска приложения".