37

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

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

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

谢谢!

4

8 回答 8

51

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

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

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

于 2008-09-29T15:29:53.993 回答
8

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

于 2013-02-10T23:52:55.830 回答
6

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

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

于 2010-10-13T15:18:35.977 回答
2

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

于 2012-02-06T08:52:21.753 回答
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() 调用,但我将其作为“堆栈”的起点痕迹”。

于 2016-03-29T16:52:11.823 回答
1
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();

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

于 2013-12-18T13:14:20.613 回答
1

从 Flash 11.5 开始,堆栈跟踪在 Flash 的发布版本中工作。

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

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

于 2014-08-25T19:38:48.097 回答
0

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

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

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

于 2016-07-11T09:10:01.270 回答