我真的很难解决我正在获得的堆栈下溢问题。我在运行时获得的回溯是:
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();">
请注意,代码已附加到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对象。关于发布(vs debug)编译的一些内容必须影响SP变量初始化的启动时间。稍后将处理程序移至onCompletion
事件可解决所有问题。
如上所述,我仍然想知道有哪些技巧/工具可用于调试这样的初始化问题。
更新2:
放置应用程序初始化代码时, applicationComplete
似乎是比creationComplete
更好的事件。请参阅this blog entry以获取一些解释,并{和3 {}}(约4:25)由Adobe Tech Evangelist查看简单的“应用程序启动”数据初始化示例。
答案 0 :(得分:12)
我通过添加编译器参数摆脱了这个错误:
的 -omit迹语句=假强>
答案 1 :(得分:4)
堆栈下溢基本上意味着编译器搞砸了。
如果您想确切知道它是如何搞砸的话,您可以使用SWFWire Inspector来查看事件处理程序的字节码。您还可以使用SWFWire Debugger查看调用的方法,但在这种情况下,您已经知道它发生了什么。
如果您发布破损的瑞士法郎,我可以为您提供更多信息。
答案 2 :(得分:3)
Sean是正确的,调试它你可以查看字节代码,但这听起来并不吸引我。
根据我的经验和研究,通常是由于存在跟踪语句错误地在发布模式下编译出来,并生成无效的字节代码。因此,我会说“调试”它,“寻找你正在使用跟踪的地方。尝试在违规函数中对它们进行全面评论,看看问题是否消失。”
就我而言,它是一个trace语句作为catch块的第一行:
catch (e:TypeError) {
trace(e.getStackTrace()); //This line is the problem
throw new Error("Unexpected type encountered");
}
我发现其他人有这个问题here。
答案 3 :(得分:2)
此代码也仅在发布模式下导致堆栈下溢(flag -debug = false):
true && trace('123');
mxlmc flex sdk version 4.5.0.20967,flashplayer version 10.3.181.14(linux)。
检查代码中是否有类似的表达方式。
答案 4 :(得分:2)
当我从flash builder 4.5
编译候选版本时,此代码导致了我的问题public function set configVO( value:PopupConfigVO ):void
{trace("CHANGING")
通过在曲线和大括号之间插入空格来解决
public function set configVO( value:PopupConfigVO ):void
{ trace("CHANGING")
希望这有帮助。
答案 5 :(得分:2)
对于寻找相同问题的人,我只是在switch语句的'default'情况下由trace语句引起的。注释掉了跟踪,堆栈下溢解决了。
答案 6 :(得分:2)
有趣......我在SWF上遇到了这个错误,我已经从网上撤下了一个基于Away3D的图形演示。当我在Tamarin VM上运行它而不是实际的Flash / AIR运行时,因此可以在“verifyFailed(kStackUnderflowError)”行上粘贴一个断点,看看发生了什么。
-Dverbose标志也帮助找到了罪魁祸首:
typecheck MethodInfo-1480()
outer-scope = [global]
[Object~ Object] {} ()
0:pop
VERIFY FAILED: Error #1024: Stack underflow occurred.
使用SWFInvestigator查看ABC,我发现了这个:
var function(Object):void /* disp_id=0 method_id=1480 nameIndex = 0 */
{
// local_count=2 max_scope=0 max_stack=0 code_len=2
// method position=52968 code position=155063
0 pop
1 returnvoid
}
所以有一个明显的问题是'trace'已被删除,但是编译器已经放了一个'pop':我不会想到这是必需的,因为跟踪调用应该是通过'callpropvoid进行的“?
为什么这不会在AIR / Flash上失败我不知道..
无论如何:看起来像ASC编译器问题,也许其中一个ActionScript3编译器有这个错误 - 因此到目前为止已经提到过变通方法。
答案 7 :(得分:0)
我有完全相同的问题,但在我的情况下,问题的原因是在编译器不希望它找到它的地方的跟踪语句,就在类开头的包声明之后:
package utils
{
trace ("trace something here");
这就是为什么在调试模式下进行编译可以解决问题。
答案 8 :(得分:0)
这很简单,它与括号,跟踪命令或其他任何东西之前或之后的空格无关:它只是一个非常简单的东西:
不要扯空!
意思是,在开发过程中,我们//有时会对某些行进行注释,并在结果时
for (...) {
// skip for now
}
编译器得到:
for(...){}
而且我的好朋友,是编译器不喜欢的东西!
所以,没有空的循环,你又在路上......
快乐狩猎, P上。