Flash / ActionScript 3.0中的StackTrace

37

我希望能够在我的代码中的任何函数中查看堆栈跟踪信息,因此我编写了以下代码来调用并打印堆栈跟踪:

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

我想知道是否有其他方法来做这件事。在某些情况下,Error类会创建堆栈跟踪,但也许在ActionScript 3.0中没有这样做,因此可能不可能,但是我想知道。

谢谢!

8个回答

51
据我所知,使堆栈跟踪对您自己的代码可用的唯一方法是通过Error类中的getStackTrace()方法,就像您已经在做的那样。针对您问题中的示例,我想提醒一下,实际上您不必抛出Error-您可以只创建它并调用该方法:
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();

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


好的,谢谢,我没有意识到那点 :)但是,很遗憾getStackTrace()是唯一获取它的方法。 - Lucas Gabriel Sánchez
我想要进行调试,而不是发布,所以这方面没有问题。再次感谢。 - Lucas Gabriel Sánchez
这不是唯一的方法。请看下面我的答案。 - Joony
1
谢谢Joony,我澄清了我的回答,改为说“使跟踪对您自己的代码可用”,而不是“获取跟踪”。 - hasseg
5
使用更简单的方式,你可以这样写:var stackTrace:String = (new Error()).getStackTrace(); 或者甚至可以写成trace("stack trace: " + (new Error()).getStackTrace());。请注意,这两种方式都是获取堆栈跟踪信息的方法。 - iND

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

6
使用Flex SDK自带的Flex DeBugger(FDB)进行调试。它是一个命令行调试器,可以调试.swf文件,甚至在线上的文件(如果是调试版本)。它允许您设置断点、打印/更改变量和转储堆栈,并且不需要添加任何额外的代码。这是一个非常有用的工具,您不应该没有它!
您需要使用fdb选项'break'来指定您想要执行停止的类和行,以及'bt'或'info stack'来给出堆栈的回溯。您还可以在应用程序运行时显示几乎所有内容。

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

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()调用将删除前两行:第一行仅是字符串“错误”,第二行引用了此函数本身,因此没有用处。如果您希望,甚至可以通过添加另一个shift()调用来删除第三行(它引用放置调用getStackTrace()函数的行),但我将其保留为“堆栈跟踪”的起点。


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

将这个 stackTrace 字符串写到任何文件中,这样你就可以在运行模式下看到程序的日志,而不仅仅是在调试器模式下运行。将其写入应用程序的 uncaughtexception 事件中,这样它将最后执行。

1
截至Flash 11.5版本,堆栈跟踪在发布版Flash中可用。
但这并不意味着这不再是一个问题。如果您的应用程序设置为使用早于11.5的编译器(在Flash Builder-->项目属性-->ActionScript Compiler中),则您将无法看到堆栈跟踪。
此外,在同一页上,您可以查看您的AIR SDK版本。如果您使用的是v3.4或更早版本,则您将看不到堆栈跟踪。如果这是您的问题,则所有开发人员都应按照此处的说明更新其AIR SDK。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接