如何调试运行时堆栈下溢错误?

时间:2011-06-07 19:52:34

标签: actionscript-3 flash debugging flex 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();">

请注意,代码已附加到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查看简单的“应用程序启动”数据初始化示例。

9 个答案:

答案 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上。