如何在非调试模式下获取Adobe AIR全局运行时错误的stacktrace?

如何在非调试模式下获取Adobe AIR全局运行时错误的stacktrace?,air,global,stack-trace,Air,Global,Stack Trace,新版本的AIR使我们能够全局捕获运行时错误并处理它们。问题是除了错误id、错误消息和名称之外,它没有stacktrace或任何关于错误的有用信息。例如,它可能会告诉我发生了一个空指针异常,但它不会告诉我发生在何处、哪个方法或任何事情。运行时的调试版本为我们提供了所有这些,但当应用程序部署到客户时,它不会在调试版本上运行,因此没有可用的有用信息。我想知道,对于如何更好地记录AIR应用程序中的错误以提高产品的可支持性,该小组是否有任何建议。有什么建议吗?在新版AIR支持之前,没有办法。由于性能问题,

新版本的AIR使我们能够全局捕获运行时错误并处理它们。问题是除了错误id、错误消息和名称之外,它没有stacktrace或任何关于错误的有用信息。例如,它可能会告诉我发生了一个空指针异常,但它不会告诉我发生在何处、哪个方法或任何事情。运行时的调试版本为我们提供了所有这些,但当应用程序部署到客户时,它不会在调试版本上运行,因此没有可用的有用信息。我想知道,对于如何更好地记录AIR应用程序中的错误以提高产品的可支持性,该小组是否有任何建议。有什么建议吗?

在新版AIR支持之前,没有办法。由于性能问题,它现在不可用,使得全局处理程序几乎毫无用处。我也在等待,因为替代方案是自己记录所有内容,这非常耗时。

编译器选项:

compiler.verbose-stacktraces=true

即使是在非调试版本中也应该嵌入堆栈信息。

我也有一些获取行号的技巧。:)

  • 使侦听器获取未捕获的错误。我在我的主课上做:

    private function addedToStageHandler(event:Event):void {
        loaderInfo.uncaughtErrorEvents.addEventListener( UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler );
    }
    
  • 例如,我的侦听器出现
    错误。getStackTrace()

  • 添加其他编译器参数:
    -compiler.verbose stacktraces=true

  • 创建发布版本
  • 现在,小黑客: 雨衣: 转到您拥有.app文件的安装位置。右键单击并选择“显示包内容”。导航到目录▸ 资源▸ META-INF▸ 空气。在那里,您可以找到一个名为hash的文件。复制哈希文件并将其重命名为debug。使用一些文本编辑器打开调试文件并删除内容。完成后,您将获得堆栈跟踪+行号。 窗户: 在文件资源管理器中浏览到其安装目录。导航到{app folder}▸META-INF▸空气▸. 在这里可以找到一个名为hash的文件。复制哈希文件并将其重命名为debug。使用一些文本编辑器打开调试文件并删除内容。完成后,您将获得堆栈跟踪+行号
  • 如果找不到哈希文件,只需创建一个没有文件扩展名的空文件,并将其称为debug

    用空气3.6测试

    关于编译器选项。 我与IntelliJ IDEA 14一起发展。在我的构建选项中,我还有“生成可调试SWF”。也许这就是它起作用的原因。检查我的附件。 格雷廷斯

    是否将此选项放在项目设置->Flex编译器->其他编译器参数中?如果是这样的话,您是在它前面加上破折号,比如so-compiler.verbose stacktraces=true还是不加破折号?我已经尝试了这一切可能的组合,但我仍然没有在我的发布版本中得到堆栈跟踪!杰森,我的情况也是一样,我无法在那种模式下追踪,我需要一些解决方案。我担心这不管用。你需要一个调试版本来完成这项工作,目前我还不知道还有其他方法。你是如何找到这个的,谢谢。难怪Adobe用Flash/Flex/AIR平台在a$$中大发雷霆。我担心它不起作用。我认为您使用的是调试构建,这就是它工作的原因。使用-debug=false时,即使使用这种方法,您仍然无法获得行号。
    private function uncaughtErrorHandler( event:UncaughtErrorEvent ):void
    {
        var errorText:String;
        var stack:String;
        if( event.error is Error )
        {
            errorText = (event.error as Error).message;
            stack = (event.error as Error).getStackTrace();
            if(stack != null){
                errorText += stack;
            }
        } else if( event.error is ErrorEvent )
        {
            errorText = (event.error as ErrorEvent).text;
        } else
        {
            errorText = event.text;
        }
        event.preventDefault();
        Alert.show( errorText + " " + event.error, "Error" );
    }