2012-02-10 61 views
0

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

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

会采取任何建议(虽然理想情况下跳过“你应该测试你的应用程序,然后再释放它”?)。

谢谢!

回答

3

不幸的是,在这一点上你可以做很多事情。显而易见的地方当然是试图让用户在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

+0

谢谢 - 这些都是好想法。 – 2012-02-11 18:11:52

0

我试过一次,一个简单的项目:我写了一个脚本,该分析的源代码,并插入一些代码,将在进入功能推函数名和堆栈参数,而在退出时,会弹出堆栈的名称和参数。

有某些情况下,当这是不够的或者很难做虽然:

  1. 如果你扔在你的代码捕获错误(我从来没有这样做,所以这是从来没有的对我而言),那么一旦捕获到错误,您就需要一些额外的功能来从堆栈中弹出很多元素。

  2. 我总是以某种方式编写我的代码,函数中最后一行也是唯一的最后一行从函数返回,所以我很容易找到所有应该从堆栈中弹出元素的地方 - 但你可能需要更复杂的算法。

  3. AS3具有极其复杂的语法,因此编写100%正确的预处理器是一项非常繁琐的任务。我已经接受预处理器在与E4X一起使用时可能产生错误的代码,如果是这样的话,必须手动修复它。

0

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

相关问题