ActionScript是否具有等效的“核心转储”?

时间:2011-08-20 22:37:37

标签: actionscript-3 actionscript

这是我的情况:我正在开发一款基于AS3的游戏,我希望有一个“报告问题!”游戏中的功能,以便用户可以向我提交反馈。

当我的用户报告问题时,我想尽可能多地获取有关游戏状态的信息;基本上是什么对象在内存中,所有这些对象中的所有变量的值是什么;当我在调试器中遇到断点时,我可以得到的信息基本相同。

有一种简单的方法吗?我担心我会花几天的时间尝试写一堆函数来获取所有这些信息给我,但之后有人告诉我,“哦,你为什么不调用ASUtils.getSnapshot()” ?

2 个答案:

答案 0 :(得分:7)

在AS3中没有通用的方法来转储变量的状态,但我们做了几件你可能会觉得有用的事情:

  1. 捕获最近点击活动的日志。使用stage事件侦听器记录单击并跟踪父链上的对象“path”到舞台。对象路径只是所有DisplayObject名称,如:screenMain.dialogBu​​yItem.buttonBuy
  2. 捕获屏幕截图,将其缩小为小缩略图,对其进行JPEG编码,然后将其与反馈一起上传到您的服务器。当出现异常时我们也会这样做(参见#4)。 as3corelibcom/adobe/images
  3. 中具有JPEG编码功能
  4. 编写一个命令行珍珠或PHP脚本,您可以在发布它之前在AS3代码上运行,这将在每个函数调用的顶部注入呼叫跟踪。这允许记录呼叫历史记录。虽然它不如完整的堆栈好,但它会给你一些关于你的代码最近在做什么的指示。
  5. 陷阱断言和未处理的异常,并通过点击活动和呼叫历史记录跟踪将其记录到您的服务器。未处理的异常侦听器是Flash 10.1中的新增功能,但大多数用户都具有此功能。您可以检查该支持并添加如下监听器:

    // Check for the presence of the Flash 10.1 global Error event (exception) handler class.
    // If it exists, we'll listen for it and it will allow us to report errors to our server.
    if ( loaderInfo.hasOwnProperty( 'uncaughtErrorEvents' ) )
        loaderInfo.uncaughtErrorEvents.addEventListener( "uncaughtError", onUncaughtError ); // UncaughtErrorEvent.UNCAUGHT_ERROR
    
  6. 如果您要使用反馈记录全局状态变量,则可以编写一个函数将其转储为字符串,以便通过用户反馈进行上载。虽然您可以使用for each枚举类和对象属性,但这仅适用于公共成员。谷歌周围,你会发现一些人们已经编写的函数,使用这个枚举技巧递归转储对象和数组数据。

答案 1 :(得分:1)

我想将其添加为评论,但不想丢失代码格式
这就是我用来追踪复杂对象的东西:

    private function parseObject(o:Object, prefix:String = '>'):String {
        var retStr:String = '';
        for (var s:String in o) {
            retStr += prefix + s + ' = ' + o[s] + '\n';
            if (typeof(o[s]) == 'object') {
                retStr += parseObject(o[s], prefix + '>');
            }
        }
        return retStr; 
    }

希望它有所帮助