Rus*_*uss 12 apache-flex debugging flash actionscript-3 stackunderflow
我真的很难解决我正在获得的堆栈下溢问题.我在运行时得到的回溯是:
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,然后调用与AsyncToken关联的AsyncResponder实例集.由于一些服务器端日志记录以及一些日志记录入侵swf,我知道UrlLoader正在成功执行并获取一个crossdomain.xml文件,正确处理它(即:如果我破坏它,我得到一个安全性错误),并且还成功完成"加载"请求(服务器发送数据).下溢似乎发生在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();">
Run Code Online (Sandbox Code Playgroud)
请注意,代码已附加到initialize事件中.
InitData()和相关的定义是:
import classes.RpcServerProxy;
public var SP:RpcServerProxy;
public function InitData():void {
SP = new RpcServerProxy("http://192.168.1.102:1234");
}
Run Code Online (Sandbox Code Playgroud)
当我将InitData()调用切换为onCompletion事件而不是initialize(感谢J_A_X!)时,问题完全消失了.似乎发生的事情是Event.COMPLETE事件处理程序(堆栈跟踪中的onComplete)正在使用全局SP对象.关于发布(vs debug)编译的一些内容必须影响SP变量初始化的启动时间.稍后将处理程序移动到onCompletion事件解决了所有问题.
如上所述,我仍然想知道有哪些技巧/工具可用于调试这样的初始化问题.
更新2:
applicationComplete似乎是一个比creationComplete放置应用程序初始化代码更好的事件.请参阅此博客文章以获取一些解释,以及此视频(大约4:25)由Adobe Tech Evangelist提供的简单"应用程序启动"数据初始化示例.
堆栈下溢基本上意味着编译器搞砸了。
如果您想确切地知道它是如何混乱的,您可以使用SWFWire Inspector查看事件处理程序的字节码。您还可以使用SWFWire 调试器来查看调用了哪些方法,但在这种情况下,您已经知道它发生在哪里。
如果您发布损坏的 swf,我可以为您提供更多信息。