Flash / ActionScript 3.0中的StackTrace

时间:2008-09-29 15:05:13

标签: flash actionscript-3 stack-trace

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

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

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

谢谢!

8 个答案:

答案 0 :(得分:50)

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

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

此外,与文档说的一样,这仅适用于Flash Player的调试版本,因此您可以将此功能包装在if块中,以便根据需要检查Capabilities.isDebugger的值。

答案 1 :(得分:8)

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我把这个小功能放在一起:

var obj = { Not: 1, long: 1, left: 2, grab: 1, an: 4, Easter: 5, bargain: 1 },
    array = Object.keys(obj).map(function (k) { return { word: k, num: obj[k] }; });

document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

// edit sorting

array.sort(function (a, b) { return a.num - b.num; });
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

我在开发时使用我的应用程序的自定义“Debug”类中有此功能。两个shift()调用删除前两行:第一行只是字符串“Error”,第二行引用此函数本身,所以它没用。如果你愿意,你甚至可以删除第三行(它指向你调用getStackTrace()函数的行)通过添加另一个shift()调用,但我把它作为“栈的起点”迹”。

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

从Flash 11.5开始,堆栈跟踪在Flash的发行版中起作用。

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

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

答案 7 :(得分:0)

INSERT INTO `wp_usermeta`(`user_id`, `meta_key`, `meta_value`) VALUES (ID148 , 'somekey','somevalue'), (ID156 , 'somekey','somevalue'), 方法仅在调试Flash播放器(https://www.adobe.com/support/flashplayer/debug_downloads.html)上返回堆栈跟踪,在发布播放器上返回getStackTrace。确保已安装并运行调试播放器。

null仅将行号添加到调试堆栈跟踪中。

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