当前位置: 首页 > 网络应用技术

扑动异常监测,符号分析和聚集转移实践

时间:2023-03-08 15:56:34 网络应用技术

  错误监视是维持应用程序稳定性的重要手段。通过对在线问题进行真实的时间监控,它可以观察到该应用程序是否具有异常条件,以便快速解决问题并制定维修解决方案。对于集成颤动的应用程序,除了提供崩溃监控外,您还需要监视扑动不上的异常。

  一般而言,监视系统将包括问题的真实时间收集,问题的分类和识别(聚集)以及模块,例如自动分配,问题定位,真实时间警报。颤动异常监测。首先,最终收集异常并执行初步处理。连续集成平台将处理每个平台的应用程序符号信息,并管理与应用程序相关的基本信息。预处理,分析,构建多层静态统计信息,最终显示到前端平台和Anomalian警报,并根据某些警报阈值配置。

  本文主要侧重于移动终端扑动异常处理,监测背景异常和监测背景异常的实践和降水。

  在引入颤音异常处理之前,我们首先可以理解颤音异常。

  Flutter异常是指该程序中DART代码丢弃的错误事件。一般而言,异常类型主要分为异常和错误及其子类型。当然,开发人员还可以自定义非null错误类型。dart支持。该程序会抛出非空类型的各种错误,如以下代码所示:

  对于扑朔迷离的应用程序,当程序异常时,该程序通常不会崩溃和退出,这与Java或Objective-C的编程语言不同。以Android Java应用为例。该方法将捕获异常并执行杀戮程序,或者系统底层的异常过程将直接杀死。

  但是,扑动的处理方法是不同的。即使我们未捕获异常,系统的默认处理方法仅是打印或替换错误窗口小部件。通常,它在应用程序上以白屏(红色屏幕)的形式表示,用户操作没有响应,等等。这就是为什么我们需要通过折叠监控之外的其他监视平台功能来处理颤音异常的原因。

  在颤动运行期间,采用事件周期机制来运行任务(https://dart.cn/articles/archive/event- loop),如下图所示,有两个不同的优先级排队。如果有事件任务触发,它将被放置在一个队列中。运行的各种任务彼此独立。当某个任务出现异常时,任务的后续代码将不会继续执行,但不会影响其他任务的执行。

  与Java类似,Flutter也可以通过TryCatch机制捕获,但是TryCatch只能捕获同步代码块的异常。对于未来的异步代码块引发的错误,您需要使用未来提供的CatchError语句。

  复制代码

  在知道如何捕获错误之后,您只需要找到正确的位置即可捕获扑朔迷离的错误。以下分为3个部分,以引入异常捕获。

  1.2.1。颤动的框架异常捕获了扑朔迷离的框架本身,捕获了许多异常,包括在施工期,布局和绘图期间的异常。

  如下所示,我们可以在方法中重写该方法以实现自己的逻辑:

  复制代码

  1.2.2。其他飞镖异常捕获是针对没有被扑朔迷离框架捕获的其他飞镖异常,例如将来的异常情况,这将被错误捕获,表明代码执行的上下文,这为异步代码和同步提供了稳定性代码。可以将操作环境简要理解为沙箱,这也是一种异常处理方法,并未捕获内部并且尚未捕获。要进行自定义,请重写捕获异常的方法,如以下代码中所示:

  复制代码

  1.2.3。上面的白屏(红色屏幕)异常捕获表明,颤动框架将捕获飞镖异常的一部分。除了统一的回调处理外,它还取代了页面页面的白屏问题的页面的错误小部件。

  如上面的代码中所示,扑朔迷离框架通过统一替换页面渲染失败而统一地取代了小部件。我们可以通过覆盖该页面处理来覆盖页面渲染的异常。类别处理。

  请注意,在官方逻辑中,还报告了更换小部件的地方。我们可以通过AOP替换逻辑,否则它将对错误数量产生一定的影响。

  在这一点上,颤抖的异常已经完成。最后,使用三个钩子单击以报告异常。它是为以下服务分析处理处理准备的。当然,在这些地方收集异常是不够的。包装处理以补充异常操作的状态信息。

  异常信息的包装主要分为两个步骤:提取和处理异常信息,添加其他信息。

  1.3.1。颤动异常提取处理首先是所有异常型萃取。通常,可以通过传递获得异常类型。但是应该指出的是,某些异常是在先前报告的钩子报告的地方封装的,因此有必要判断其例外。

  此外,我们是概述提取,我们通过在“颤音框架”中使用函数获得,如下所示:

  也有堆栈的报道。在报告异常报告的地方将有堆栈信息。对于“颤抖”框架包装,您可以提取它。处理异常信息后,我们需要在异常信息中添加一些其他通用信息,以帮助解决异常。

  1.3.2。为了帮助Flutter的异常有效的解决方案,我们在异常报告中添加了一些其他信息,包括设备信息,页面信息,内存信息和唯一检索信息的路径掩埋,当异常报告时,我们添加了一些其他信息。其中可以在我们的文章(随附的地址)中的另一篇文章中找到获取页面信息的方法。此信息可以帮助我们查看异常趋势和维修状态,如下所示:

  报告报告的状态和操作信息可以帮助学生的定位:

  当监视背景接收到移动终端上报告的异常日志时,首先要做的就是准备收到的异常日志。这两个主要模块是异常分类和异常堆栈符号的符号分析。

  通过上面,我们知道颤音异常不会导致崩溃,因此扑动异常肯定会影响用户吗?这是一个与崩溃不同的地方不同的地方。通常,发生崩溃时,但是颤动是异常的。

  在所有狂热异常中,一些异常使用者没有感知。可能是同学的初始发展代码不是由无效的呼叫引起的,或者可能是构建的多重错误;例如,图片错误,同学无法处理这种类型问题(还有其他监视服务,例如在线警报服务)。在这种情况下,如果我们将所有错误都放在发展中的同学面前,无论发展同学之间有什么区别,无论区分如何,无论优先如何,他们都无法有效地处理优先处理的优先级。毕竟,发展学生的能量有限。我们应该专注于可以解决的问题以及对用户的真正影响。

  因此,对于狂热的异常,我们将其分为三类:

  它还经历了培养学生对扑朔迷离异常的积极治疗的第一阶段。我们优化了监测平台处理扑朔迷离异常分类的能力。

  一种是区分报告信息,即上述报告页面的渲染是异常的,包括白屏(红色屏幕)问题。

  首先是由渲染故障引起的红色屏幕和白屏。对于Casterror,RangeRor,PlatformException,Nosuchmethoderror,缺少Pluginexception和其他错误类型。他人(例如异常或网络异常),我们将其放在次要问题上。其中,我们更特别,例如Nosuchmethoderror。我们过滤了一些异常,其中某些异常也置于次要误差中。

  其中,将第一个级别的错误和次要错误显示到不同的位置,并提供后续的差异警报,以确保快速聚焦的核心问题。

  在Flutter1.17或更高版本的版本中,官员支持删除Flutter产品的符号表的功能。考虑到颤音产品的应用程序的安全性以及包装大小的问题,我们已将此功能集成到包装系统中,并通过官方支持的官方支持,包装命令可以在包装期间分开符号表文件。

  - 可以将debug-info与调试信息符号信息分开

  但是,这也会导致堆栈据报道颤音的异常是象征的,并且很难阅读理解。如下所示:

  在这种情况下,我们需要一个符号间分析系统来处理堆栈并将其转换为可理解的堆栈信息。当然,剥离符号表信息不仅会影响颤音异常的堆栈,而且还影响了本机崩溃中相关的扑朔迷离堆栈。

  分析符号表的第一件事是在编译和包装过程中处理符号表文件。

  2.2.1。上面,上面,在编译过程中上面,上面的flutter符号表文件处理,通过命令生成并将符号文件剥离并保存到指定的目录中。在包装过程中,分析了应用程序产品的其他相关信息,例如版本,例如版本,哈希等,然后将此信息发送到监视平台以进行分析和处理以使用后续的符号分析和使用。

  完整的体系结构图如下:

  使用符号表文件,其余的是堆栈的分析处理。

  2.2.2。Flutter异常符号分析首先需要从Flutter产品中理解此符号文件,该文件将所有信息存储到DART VM AOT编译器中,以将源代码映射到信息encoding.file。以iOS为例,Android可以通过文件命令知道,这是一个精灵文件:

  。文件app.ios-searm64.symbols

  s App.ios-rm64.symbols:Elf 64位LSB共享对象,ARM AARCH64,版本1(SYSV),Dynamicallly Linked,buildId [md5/uuid] = xxxxx,defug_info,不使用状态

  ELF(可执行且可链接的格式)是由可执行文件,目标文件,共享链接库和核心转储准备的标准文件格式。通过以下命令,可以生成两个相关文件:

  m dwarfdump app.ios-ram64.symbols-debug-info> info.txt

  m dwarfdump app.ios-ram64.symbols-debug-line> line.txt

  其中,源代码信息存储在信息文件中,并且与行号相关的信息存储在行文件中。以文件文件中的函数信息之一的形式:信息文件:

  复制代码

  在:

  这意味着函数的含义,

  它是它的源信息,

  相对于符号表文件的符号,他是此功能的高和低偏移。以下称为

  在以下堆栈中,

  它表示此堆栈行的错误消息在“指令”部分中,背面的偏移是相对初始偏移。以下内容被称为固定在符号表中。

  只要发现它,我们就可以找到源代码信息。他们的关系也很明显。通过命令找到相对符号表文件的偏移,然后

  i nm app.ios-searm64.symbols

  s _kdartisolatersnapshotinstructions b 0x6000,0x6000是0x6000

  最后,只要我们在信息文件中找到源信息的总和,我们就可以找到源代码信息。

  同样,在获取此信息后,我们可以通过线文件中的偏移地址的映射关系找到相应的行号信息。在这里,我们不会解释它。

  那么,我们如何意识到这套分析逻辑呢?当然,由于官员提供了象征化的逻辑,因此将有符号分析的逻辑。可以通过阅读Flutter_Tools源代码来知道。该官员还提供了符号的订单符号,符号解释,符号文件和堆栈的输入,库中的分析处理,如以下代码所示:

  其中,逻辑的阅读还可以验证上述逻辑。其中,计算位移的方法,该官员还提供了其他几种计算方法:

  其中,还可以获得两个运行时偏移地址和堆栈标题信息中两个运行时偏移的减法。之后,最终获得了第一个逻辑。

  此外,官方仅支持的文件堆栈输入输入,而后端服务不能直接依赖整个飞镖的执行环境,因此我们拆卸逻辑并扩展堆栈类型,如下以下代码,如下所示,如下所示,如下所示。以下代码启动

  最后,它通过以下命令将其包装到LinuxMacos可执行脚本中,该命令提供给后端服务以进行堆栈信息分析。

  除了颤音的异常符号分析外,删除符号表还将影响颤动引起的崩溃堆栈分析。下面我们介绍分析过程。

  2.2.3。Flutter崩溃符号分辨率与崩溃堆栈,Android和iOS堆栈以及分析方法不同。让我们分别描述iOS和Android中的扑朔迷离堆栈的分析处理。

  对于iOS崩溃,由应用程序引起的崩溃。FrameWork产品将包含类似于以下内容的堆栈:

  我们需要做的是可以转换为脚本的堆栈,如上所述:

  换句话说,我们必须将App的抵消。FrameWork并根据上面的同一想法进行处理。首先,我们需要计算app.framework段中分离株和VM指令段的偏移地址。通过这些地址的偏移和相对于app.framework的偏移,可以获得相对与分离株和VM的偏移地址,也就是说,如何获取相对于app.framework.get的分离株和VM指令段的偏移地址。

  f nm app.framework |GREP_KDARTISOLATESNAPSHOTINSTICTIONS

  00 00000000008000 t _kdartisolatesnapshotinstructions

  f nm app.framework |grep_kdartvmsnapshotinstructions

  00000000004000 T _KDARTVMSNAPSHOTINSTICTIONS,0000000000008000是分离株指令段相对于App.FrameWork的扩展。

  因为该命令的执行逻辑是对应用程序的分析。帧件,它实际上在上面提到的连续集成包装期间的象征处理过程中。它是通过上述命令分析获得的,然后保存到异常的监视平台。

  特定分析的步骤如下所示:

  1.相对于从app.framework偏移量的偏移,获得了通过NM命令的连续集成获得的偏移量,并获得了kylate_offset或vm_offset;

  2.然后使用上一步的结构将其缝合到可以识别的堆栈中。

  3.对每个行堆栈重复1或2步,然后使用脚本对其进行解析。

  对Android和iOS的分析,我们只需要处理包含DART代码的相关堆栈。对于Android Crash,Libapp.so相关的堆栈包含如下的堆栈:

  它的处理方法非常简单,因为它是直接的,因此我们只需要将可以识别成一个可以识别为可以识别的堆栈中的堆栈中的堆栈,该堆栈可以识别。堆栈信息已经结束。下一步是利用颤音异常报告的信息来分析颤音异常。

  该部分的主要内容是异常的聚合和分布和统计计算。

  聚合异常是监测平台的非常重要的能力。它可以帮助我们计算异常时间的真正时间影响。根据门槛警告并提前回复。

  例如,如果短时间发生异常的时间超过阈值,那么我们将通过呼叫警报通知负责人,然后进行停止灰度,更换在线袋或热维修以及其他决定。

  汇总采用了通过分支机构解析堆栈信息的方法,并找到最接近的业务(非流量框架代码)或最能反映错误的行堆栈框架。

  通过以下规律性,可以分析类名称,函数名称,软件包名称,每行文件名

  “^#(d+)+(。+)((。+?):?(d+)?:( d+)?)$

  之后,您可以基于应用程序构建集成平台的信息。如果匹配成功,则可以将此线框架作为聚合物信息。

  注意:请勿在汇总信息中包含行号信息,因为可以修改但不能修改异常。在这种情况下,删除行号信息,让该错误汇总为一个。

  3.1.1。在某些情况下,特殊处理可能不会通过业务堆栈框架生效。通过分析大量的颤音异常堆栈,我们发现,由于未来的异步调用问题,堆栈中有许多堆栈,没有业务堆栈,并且异常被汇总到无效的堆栈框架中。

  例如,以下PlatformException错误信息(如果业务堆栈框架的优先级逻辑)对于没有业务堆栈帧的堆栈,它将使用第一行作为聚合信息,这将导致大量与系统相关的错误将一个人分解为OneError,解决我们的问题,并且阈值警报非常令人不安。

  因此,除了业务堆栈框架的优先集合的逻辑外,我们还对异步堆栈框架进行了特殊处理:异步堆栈帧的呼叫者(第2行)的呼叫者高于收件人。通过此处理中的这三行,代码处于此错误。

  此外,我们还提供堆栈框架美白列表的策略,白色列表中的堆栈框架信息不属于错误消息。它还可以使异常不是汇总到某个无效的堆栈框架中,并进一步减少无效的堆栈聚合问题。

  当然,有效的监视平台具有自动分配异常的能力,可以帮助负责人快速收到警报和响应错误。上面描述了上述异常时汇总的帧的关键信息。使用两种策略:

  1.包括业务堆栈的异常,负责人是通过在集成平台上构建评估信息直接分配的;

  2.对于没有业务堆栈框架的异常,根据异常类型分配。例如,在上述其他其他信息中,根据页面信息分配了白屏问题。最终效果如下所示:

  在崩溃监控中,崩溃率计算通常使用两个口径:

  会话崩溃率:每次用户打开应用程序进行会话时,都会获得会话的数量/会话数

  设备崩溃率:每个用户仅崩溃一次一次,可以获得崩溃的数量/用户数量

  但是这两个不适合颤动,因为当扑动不动时,应用程序不会崩溃,因此上面提到的两个计算口径无法真正反映应用程序的稳定性。

  例如,打开页面可能发生多种异常,但不会崩溃,因此,将根据会议的崩溃率获得不合理的N/1异常率,尤其是混合发育中的颤动不是实现的。APP的所有功能。会话和设备崩溃率中将有更多偏差,因为在打开应用程序时,用户可能不会使用颤音功能。

  因此,我们采用了一种新的统计能力:

  页面异常率,用户每次打开页面时都会制作PV,并且获得异常/PV的数量

  通过这种计算方法,我们不仅可以在应用程序中获得整体页面异常的颤动率,而且还可以计算该页面对单个业务页面的稳定性。

  以上是当壳体在大规模施用颤动时监测异常稳定性时,异常稳定性的一些实践和沉淀。我希望它对您有帮助。对于Flutter的异常治疗,将来需要做一些事情,例如根据异常类别,根据异常的类别,按照阈值警报以及异步堆栈Traceabible,单页分析等,根据异常的类别,单页分析等等。有机会,您会带给您更多相关的文章。

  如果您有兴趣,请记住喜欢???????外秀,您将来会尽快收到其他文章。

  原始:https://juejin.cn/post/7103359322456850439