Flash / ActionScript 3.0中的StackTrace
我想在我的代码的任何函数中看到堆栈跟踪,所以我做了这样的事情来调用它并打印堆栈跟踪:
public function PrintStackTrace() { try { throw new Error('StackTrace'); } catch (e:Error) { trace(e.getStackTrace()); } }
我想知道是否有其他方式来做到这一点。 在某些地方,Error类会创build堆栈跟踪,但也许它不会使用ActionScript 3.0来实现,所以也许这不是可行的,但是我想知道。
谢谢!
据我所知,使堆栈跟踪可用于您自己的代码的唯一方法是通过Error类中的getStackTrace()方法,就像您已经在做的一样。 在回答你的问题中的例子时,我会提到你实际上不必抛出错误 – 你可以创build它并调用它的方法:
var tempError:Error = new Error(); var stackTrace:String = tempError.getStackTrace();
另外,就像文档所说的,这只能在Flash Player的debugging版本中使用,所以你可以把这个function包装在一个if-block中,如果你愿意,它可以检查Capabilities.isDebugger的值。
从Flash Player 11.5起,堆栈跟踪也可以在非debugging器版本的玩家中使用。
使用Flex SDK附带的Flex DeBugger(FDB)。 这是一个命令行debugging器,它允许你debugging.swf,甚至在线(如果它是一个debugging版本)。 它允许你设置断点,打印/更改variables和转储堆栈, 而不需要添加任何额外的代码 。 一个非常有用的工具,你不应该没有!
你将需要的fdb选项是'break',并指定你希望执行停止的类和行,'bt'或'info stack'给你一个堆栈的回溯。 您也可以在运行时显示应用程序的几乎所有信息。
@hasseg是对的。 您还可以在编译SWF时提供-compiler.verbose-stacktraces = true来保留发行版本(不是debugging版本)中的堆栈跟踪信息。
我把这个小function放在一起:
public static function getStackTrace() : String { var aStackTrace : Array = new Error().getStackTrace().split("\n"); aStackTrace.shift(); aStackTrace.shift(); return "Stack trace: \n" + aStackTrace.join("\n"); }
我在开发时使用我的应用程序的自定义“debugging”类中有此function。 两个shift()调用删除前两行:第一行是string“错误”,第二行是指这个函数本身,所以没有用。 如果你愿意的话,你甚至可以删除第三行(它指的是你调用getStackTrace()函数的那一行),通过添加另一个shift()调用,但是我把它作为“栈跟踪”。
var tempError:Error = new Error(); var stackTrace:String = tempError.getStackTrace();
把这个stackTrace
string写入任何文件,这样你也可以在运行模式下看到你的程序的日志。 所以你不需要在debugging模式下运行它。 把它写入应用程序的uncaughtexception
事件,所以它会最后执行。
从Flash 11.5开始,堆栈跟踪工作在Flash的发行版中。
但是,这并不意味着这不再是一个问题。 如果您的应用程序在Flash Builder --> Project properties --> ActionScript Compiler
设置为使用11.5以前的Flash Builder --> Project properties --> ActionScript Compiler
,则不会有堆栈跟踪。
另外,在同一页面上,您可以看到您的AIR SDK版本。 如果您使用v3.4或更高版本,则不会看到堆栈跟踪。 如果这是您的问题,则所有开发人员都应按照此处的说明更新其AIR SDK。
getStackTrace
方法仅在debugging闪存播放器( https://www.adobe.com/support/flashplayer/debug_downloads.html )上返回堆栈跟踪,在发布播放器上返回null
。 确保您已经安装并运行了debugging播放器。
-compiler.verbose-stacktraces=true
仅将行号添加到debugging堆栈跟踪。
示例testing: https : //gist.github.com/pipeno/03310d3d3cae61460ac6c590c4f355ed