【问题标题】:StackTrace in Flash / ActionScript 3.0Flash / ActionScript 3.0 中的 StackTrace
【发布时间】:2010-09-14 00:38:00
【问题描述】:

我想在我的代码的任何函数中查看堆栈跟踪,所以我做了这样的事情来调用它并打印堆栈跟踪:

public function PrintStackTrace() {
    try {
        throw new Error('StackTrace');
    } catch (e:Error) {
        trace(e.getStackTrace());
    }
}

我想知道是否有其他方法可以做到这一点。在某些地方,Error 类创建了堆栈跟踪,但也许它没有在 ActionScript 3.0 中做到这一点,所以也许它不可行,但我想知道。

谢谢!

【问题讨论】:

    标签: flash actionscript-3 stack-trace


    【解决方案1】:

    getStackTrace 方法仅在调试 Flash 播放器 (https://www.adobe.com/support/flashplayer/debug_downloads.html) 上返回堆栈跟踪,在发布播放器上返回 null。确保您已安装并运行调试播放器。

    -compiler.verbose-stacktraces=true 仅将行号添加到调试堆栈跟踪。

    样本测试: https://gist.github.com/pipeno/03310d3d3cae61460ac6c590c4f355ed

    【讨论】:

      【解决方案2】:

      我整理了这个小功能:

      public static function getStackTrace() : String
      {
          var aStackTrace : Array = new Error().getStackTrace().split("\n");
          aStackTrace.shift();
          aStackTrace.shift();
          return "Stack trace: \n" + aStackTrace.join("\n");
      }
      

      我在开发时与我的应用程序一起使用的自定义“调试”类中具有此功能。两个 shift() 调用删除了前两行:第一行只是字符串“Error”,第二行引用了这个函数本身,所以它没有用。如果您愿意,您甚至可以删除第三行(它指的是您调用 getStackTrace() 函数的行),方法是添加另一个 shift() 调用,但我将其作为“堆栈”的起点跟踪”。

      【讨论】:

        【解决方案3】:

        从 Flash 11.5 开始,堆栈跟踪可在 Flash 的发布版本中使用。

        但是,这并不意味着这不再是一个问题。如果您的应用程序在Flash Builder --> Project properties --> ActionScript Compiler 中设置为使用早于 11.5 的编译器,您将不会有堆栈跟踪。

        此外,在同一页面上,您可以看到您的 AIR SDK 版本。如果您使用的是 v3.4 或更早版本,您将看不到堆栈跟踪。如果这是您的问题,您的所有开发人员都应按照说明here 更新他们的 AIR SDK。

        【讨论】:

          【解决方案4】:
          var tempError:Error = new Error();
          var stackTrace:String = tempError.getStackTrace();
          

          将此stackTrace 字符串写入任何文件,以便您也可以在运行模式下查看程序的日志。所以你不需要只在调试器模式下运行它。将其写入应用程序的uncaughtexception 事件中,使其最后执行。

          【讨论】:

            【解决方案5】:

            从 Flash Player 11.5 开始,堆栈跟踪也可用于播放器的非调试器版本。

            【讨论】:

              【解决方案6】:

              @hasseg 是对的。您还可以通过在编译 SWF 时提供 -compiler.verbose-stacktraces=true 来保留发布版本(而非调试)中的堆栈跟踪信息。

              【讨论】:

                【解决方案7】:

                据我所知,使堆栈跟踪可用于您自己的代码的唯一方法是通过 Error 类中的 getStackTrace() 方法,就像您已经在做的那样。不过,在回答您问题中的示例时,我会提到您实际上不必抛出错误 - 您只需创建它并在其上调用方法:

                var tempError:Error = new Error();
                var stackTrace:String = tempError.getStackTrace();
                

                此外,正如文档所述,这仅适用于 Flash Player 的调试版本,因此您可以将此功能包装在一个 if 块中,如果需要,该块会检查 Capabilities.isDebugger 的值。

                【讨论】:

                • 好的,谢谢,我没有意识到 :) 但是,很遗憾 getStackTrace() 是获取它的唯一方法。
                • 我希望它调试,而不是发布,所以没有问题。再次感谢。
                • 这不是唯一的方法。请参阅下面的答案。
                • 谢谢 Joony,我澄清了我的回答是说 “使跟踪可用于您自己的代码” 而不是 “获取跟踪” .
                • 不用大惊小怪,你可以简单地写:var stackTrace:String = (new Error()).getStackTrace(); 甚至trace("stack trace: " + (new Error()).getStackTrace());
                【解决方案8】:

                使用 Flex SDK 附带的 Flex 调试器 (FDB)。它是一个命令行调试器,允许您调试 .swf,甚至是在线调试器(如果它是调试版本)。它允许您设置断点、打印/更改变量和转储堆栈,并且不需要您添加任何额外代码。一个非常有用的工具,你不应该没有!

                您将需要的 fdb 选项是“break”并指定要停止执行的类和行,以及“bt”或“info stack”为您提供堆栈的回溯。您还可以在应用程序运行时显示应用程序的几乎所有内容。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-03-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多