12

我真的很难解决我得到的堆栈下溢。我在运行时得到的回溯是:

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放置应用程序初始化代码更好。有关一些解释,请参阅此博客条目,以及Adob​​e Tech Evangelist 的此视频(大约 4:25),以获取简单的“应用程序启动”数据初始化示例。

4

9 回答 9

12

我通过添加编译器参数摆脱了这个错误:
-omit-trace-statements=false

于 2012-09-13T13:23:05.243 回答
4

堆栈下溢基本上意味着编译器搞砸了。

如果您想确切地知道它是如何搞砸的,您可以使用SWFWire Inspector查看事件处理程序的字节码。您还可以使用SWFWire Debugger查看调用了哪些方法,但在这种情况下,您已经知道它发生在哪里。

如果您发布损坏的 swf,我可以为您提供更多信息。

于 2011-06-08T01:56:08.193 回答
3

肖恩说得对,调试它可以查看字节码,但这听起来对我没有吸引力。

根据我的经验和研究,这通常是由于在发布模式下错误地编译出的跟踪语句的存在,并生成了无效的字节码。所以,我会说“调试”它,“寻找你使用跟踪的地方。尝试在有问题的函数中将它们全部注释掉,看看问题是否消失。”

在我的例子中,它是作为 catch 块的第一行的跟踪语句:

catch (e:TypeError) {
    trace(e.getStackTrace()); //This line is the problem
    throw new Error("Unexpected type encountered");
}

我在这里找到了有这个确切问题的其他人。

于 2012-02-13T11:48:50.183 回答
2

此代码还仅在发布模式下导致堆栈下溢(标志 -debug=false):

true && trace('123');

mxlmc flex sdk 版本 4.5.0.20967,flashplayer 版本 10.3.181.14 (linux)。

检查您的代码是否有类似的表达式。

于 2011-08-04T09:50:34.900 回答
2

当我从 flash builder 4.5 编译候选版本时,此代码引起了我的问题

public function set configVO( value:PopupConfigVO ):void
        {trace("CHANGING")

通过在迹线和花括号之间插入空格来解决

public function set configVO( value:PopupConfigVO ):void
        { trace("CHANGING")

希望这可以帮助。

于 2012-01-24T11:16:21.473 回答
2

对于寻找相同问题的人,我只是在 switch 语句的“默认”情况下得到了一个跟踪语句引起的。注释掉跟踪,堆栈下溢已解决。

于 2012-09-07T05:03:40.517 回答
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        
}

所以有一个明显的问题,“跟踪”已被删除,但编译器在那里放了一个“弹出”:我不会认为这是需要的,因为跟踪调用应该是通过“callpropvoid”进行的?

不知道为什么这不会在 AIR/Flash 上失败..

无论如何:在我看来,这就像一个 ASC 编译器问题,即可能其中一个 ActionScript3 编译器有问题 - 因此到目前为止已经提到了解决方法。

于 2013-05-03T15:37:41.460 回答
1

它非常简单,它与括号前后的空格、跟踪命令或其他任何东西没有任何关系:它只是 1 非常简单的东西:

不要循环为空!

意思是,在开发过程中,我们有时都会//评论一些行,而这会导致

 for (...) { 
             // skip for now
         }

编译器得到:

      for(...){}

我的好朋友们,是编译器不喜欢的东西!

所以,没有空循环,你又在路上了......

狩猎快乐,P。

于 2014-02-26T07:22:53.960 回答
0

我遇到了完全相同的问题,但在我的情况下,问题的原因是在类开头的包声明之后编译器没想到它会找到它的位置的跟踪语句:

package utils 
{

trace ("trace something here");

这就是为什么在调试模式下编译消除了这个问题。

于 2013-07-02T05:27:16.073 回答