【问题标题】:Debug run time errors in released flex app在发布的 flex 应用程序中调试运行时错误
【发布时间】:2012-02-11 07:14:43
【问题描述】:

似乎没有一种方法可以访问在通用用户的非调试器版本的闪存上运行的 Flex 应用程序的已发布版本的堆栈跟踪。我仍然可以访问错误号,但在某些情况下这还不够好。

想知道是否有人对如何解决这个问题有任何提示。我能想到的就是在某个缓冲区中记录尽可能多的事件,然后在发生崩溃时将其转储到服务器。我已经实现了这个并且没关系,但不幸的是,如果您的代码库相当广泛,那么在整个地方添加日志记录似乎不太实用。但也许有一种方法可以以某种我没有想到的简单方式记录各种东西 - 某种集中式侦听器?或者其他方法?

会接受任何建议(尽管最好跳过“您应该在发布应用之前对其进行测试”?)。

谢谢!

【问题讨论】:

    标签: flash apache-flex


    【解决方案1】:

    不幸的是,此时您可以做的事情并不多。显而易见的起点当然是尝试让用户在 Flash Player 的调试器版本上运行程序。但是,如果您不能,并且您需要找到一种方法来以“包罗万象”的方式“内置”运行时错误检测,那么我只能想到两种直接的补救措施:

    1. 在应用程序的关键点插入默认日志消息。这应该是更高层次的抽象,可能在创建或删除模块,或者开始和完成复杂任务时。理想情况下,日志记录也应该是可配置的,以便您可以在需要时打开或关闭详细输出,例如通过更改配置文件或在编译期间设置环境变量 - 调试代码会大大降低您的应用程序的速度,并且您不希望每次遇到错误时都必须添加和删除单独的跟踪语句。如果您是高级 ActionScript 开发人员,您甚至可能想找到一种通过元数据和/或自定义命名空间实现日志记录的方法 - 这是一种更简洁的方法。

    2. catch-all approach 应用于您的整个应用程序,并跟踪堆栈中捕获的每个错误。也许这可能不会比你已经拥有的更明确,但至少你可以干净地关闭程序(例如,通过向用户显示一条消息)而不是让它崩溃。

      李>

    不幸的是,您已经以“不要告诉我在发布之前进行测试”的态度创建您的程序 - 除了启动调试器和多花些时间。实际上,您应该在编写代码之前对每一行代码进行测试...但我不会深入探讨 - TDD 通常需要比单个代码更多的解释回答。

    您可以做一些简单的事情来让您的未来生活更轻松:

    人们通常犯的最大错误是一开始就不让错误发生:例如,如果您的应用程序代码中有很多null-checks:

    if (myVar != null) doMyStuff(); // or
    if (myVar == null) return;
    

    这通常用于防止可怕的#1009 错误出现,它相对有效,乍一看它比使用try...catch 块更快。但它也会掩盖问题的根源,甚至不引起注意:您的错误可能会在稍后出现,在 doMyStuff() 中应该初始化其他内容,或者可能成为您忘记检查的地方。

    避免错误的最佳策略是:

    • 切勿返回或分配非法值(例如,不允许您的函数返回 null,为所有变量分配初始值等)

    • 在应用程序的关键点实现try...catch(基本上是在出现问题时)。然后,它们会在捕获到错误时发送详细的日志消息,这样您就可以轻松找出原因,而无需求助于冗长的调试会话。

    • 创建自我验证对象。我喜欢有一个verify() 方法,它在对象被初始化或添加到舞台之前被调用,检查所有必要的依赖关系 - 如果有任何东西丢失或有错误的值,则抛出一个InstantiationException

    【讨论】:

      【解决方案2】:

      我曾经为一个简单的项目尝试过:我编写了一个脚本,它解析源代码并插入一些代码,这些代码将在输入函数时将函数名称和参数推送到堆栈上,并在退出时弹出名称以及来自堆栈的参数。

      在某些情况下,这样做还不够或非常困难:

        1234563被抓到了。
      1. 我总是以某种方式编写代码,即函数中的最后一行也是唯一的最后一行从函数返回,因此我很容易找到应该从堆栈中弹出元素的所有位置 -但您可能需要更精细的算法。

      2. AS3 的语法极其复杂,因此编写一个 100% 正确的预处理器是一项非常乏味的任务。我已经接受预处理器如果与 E4X 一起使用可能会产生错误的代码,如果是这种情况,必须手动修复它。

      【讨论】:

        【解决方案3】:

        我遵循 weltraumpirat 的回答并添加了更多“最佳实践”。实现另一个只保存字符串数组的记录器。您应该在应用程序的大部分部分使用日志记录。这样,您就可以拥有类似于人工堆栈跟踪的东西。通过在启动时加载配置 xml 或其他内容,使内存调试器的日志级别可通过网络服务器进行控制。添加全局故障和错误处理程序并将它们集中在一起。用ie构建一个错误值对象。球员能力,人工。堆栈跟踪,组织。错误消息等,并尝试通过远程调用将其发送到服务器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-15
          • 1970-01-01
          • 2017-07-02
          • 1970-01-01
          相关资源
          最近更新 更多