我真的很难解决我得到的堆栈下溢。我在运行时得到的回溯是:
VerifyError:错误 #1024:发生堆栈下溢。 在 flash.events::EventDispatcher/dispatchEventFunction() 在 flash.events::EventDispatcher/dispatchEvent() 在 flash.net::URLLoader/onComplete()
这特别难以调试,因为当我在调试模式下运行时,它根本不会发生。它仅在编译为发行版时发生。
有人对如何调试堆栈下溢有任何提示吗?是否清楚地解释了这对 Flash 意味着什么?
如果有帮助,当我单击其处理程序进行 RPC 调用的按钮时会发生此错误,该调用使用 URLLoader、AsyncToken,然后调用与 AsyncToken 关联的一组 AsyncResponder 实例。通过一些服务器端日志记录以及一些入侵 swf 的日志记录,我知道 UrlLoader 正在成功执行并且 GET'ing crossdomain.xml 文件,正在正确处理它(即:如果我破坏它,我会获得安全性错误),并且也成功完成了“加载”请求(服务器发送数据)。下溢似乎发生在 Event.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 事件处理程序(堆栈跟踪中的 onComplete)正在使用全局 SP 对象。发布(与调试)编译有关的某些内容一定会影响 SP 变量初始化的启动时间。稍后将处理程序移至onCompletion
事件解决了所有问题。
如上所述,我仍然想知道有哪些技巧/工具可用于调试此类初始化问题。
更新 2:
applicationComplete
似乎比creationComplete
放置应用程序初始化代码更好。有关一些解释,请参阅此博客条目,以及Adobe Tech Evangelist 的此视频(大约 4:25),以获取简单的“应用程序启动”数据初始化示例。