我正在努力解决一个堆栈下溢的问题。运行时我得到的回溯是:
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,然后调用与AsyncToken相关联的AsyncResponder实例集。通过一些服务器端日志记录以及一些记录到SWF中的日志,我知道UrlLoader成功地执行并GET了crossdomain.xml文件,正确处理了它(即:如果我破坏它,我会得到一个安全错误),并且还成功完成了“load”请求(服务器发送数据)。下溢似乎发生在事件.COMPLETE监听/处理过程中(正如回溯所暗示的那样)。
mxmlc使用的版本为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()和相关定义是/曾经是:
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事件处理程序(stack trace中的onComplete)正在使用全局SP对象。与发布(vs debug)编译有关的某些内容必须影响了SP变量初始化的启动时间。将处理程序后移至onCompletion事件可解决所有问题。
如上所述,我仍然想知道有哪些调试初始化问题的技巧/工具可用。
更新2:
applicationComplete
事件似乎比creationComplete
事件更适合放置应用程序初始化代码。请参见此博客文章进行一些解释,并参见Adobe Tech Evangelist的此视频(大约在4:25处)以获取有关简单的“应用程序启动”数据初始化的示例。