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

问题描述:

这是我的情况:我正在开发一个基于AS3的游戏,我想要“报告问题!”在游戏中的功能,使用户可以提交反馈给我。ActionScript是否具有“核心转储”的等效功能?

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

有没有简单的方法来做到这一点?我担心我会花几天的时间写出一大堆函数来为我提供所有这些信息,但之后才有人告诉我,“哦,你为什么不直接调用ASUtils.getSnapshot()” ?

+0

有一些间接证据表明常规Flash Player在运行时没有足够的信息来执行有意义的一般转储。特别是:'Error.getStackTrace()'只适用于调试播放器。 –

+0

您可以使用在发布之前运行的脚本来注入呼叫跟踪。这允许您在非调试闪存播放器上记录函数调用历史记录。 (请参阅下面的答案) – Toxikman

有一个在AS3没有通用的方法来转储你的变量的状态,但也有几件事情我们做,你可能会发现有用:

  1. 捕获日志最近的点击行为。使用阶段事件侦听器记录点击并跟踪父级链上的对象“路径”到舞台。对象路径只是所有的DisplayObject名称,如:screenMain.dialogBu​​yItem.buttonBuy
  2. 捕获屏幕截图,将其缩小为小缩略图,JPEG编码并将其上传到服务器及其反馈。当出现异常时我们也会这样做(见#4)。 as3corelib具有JPEG编码功能com/adobe/images
  3. 编写一个命令行珍珠或PHP脚本,您可以在您的AS3代码上运行,然后发布它,在每个函数调用的顶部插入呼叫跟踪。这允许记录通话记录。尽管它不如完整的堆栈,它会给你一些你的代码最近在做什么的迹象。
  4. 陷阱断言和未处理的异常,并通过点击活动和呼叫历史记录将它们记录到您的服务器。未处理的异常侦听器是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 
    
  5. 如果要记录与反馈全局状态变量,你可以编写一个函数来他们转储到一个字符串与上传用户反馈。虽然您可以使用for each来枚举类和对象属性,但这只适用于公共成员。谷歌周围,你会发现人们已经写了一些函数递归使用这种枚举技巧转储对象和数组数据。

+0

非常彻底。关于将变量转储到字符串,下面是我使用的变量:[ObjectUtil.as](https://github.com/magicalhobo/SWFWire/blob/master/SWFWireUtils/src/com/swfwire/utils/ObjectUtil.as)。它侧重于看起来漂亮而不是表现。 –

+0

肖恩的转储对象的代码是很好的。 SWFWire是令人印象深刻的,不错的作品肖恩!我试图通过SWFWire调试器来运行我们的游戏,但它失败了。 :(我在GitHub上发布了一个bug,它是一个很好的工具,可以检测没有收集垃圾的对象。 – Toxikman

我想将其添加为一个评论,但不希望失去的代码格式
这是我使用的跟踪复杂的对象是什么:

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; 
    } 

希望这会有所帮助