为什么会出现捕获不到/其他三方SDK捕获比UAPM多/接入UAPM后其他三方捕获变少?
问题:
已接入其他三方崩溃监控SDK,新增UAPM后为什么其他三方SDK捕获变少了?
为什么接入UAPM后没有收到崩溃?
回答:
如您遇到接入UAPM后没有收到崩溃的情况,请先按照下面的排查流程进行排查,确保接入环节无误;
无数据排查方式:https://developer.umeng.com/docs/193624/detail/212304
此外也建议您阅读下面关于捕获原理信息;
Andorid
Java崩溃:通过系统提供的UncaughtException API捕获。
Native崩溃:当系统遇到不可恢复的错误时会通过异常中断的方式触发异常处理流程,这些中断的处理被统一为了信号量。当应用程序接收到某个信号量时会按照内核默认的动作处理,如Term、lgn、Core、Stop、Cont。同时我们也可以通过sigaction注册接收信号来指定处理动作,比如捕获崩溃信息等。
一款应用在集成过程中可能会接入多款第三方SDK,除直接接入的崩溃监控SDK(如UAPM、Bugly、听云等外)可能存在多款第三方SDK都有崩溃/异常捕获功能。在不知道哪些SDK有捕获崩溃时可通过观察堆栈的调用顺序来观察,当出现不同平台捕获崩溃数据差异时可以通过判断堆栈的调用顺序来判断是在捕获过程中哪里出现的问题。
根据以往经验堆栈中会存在多个捕获器时,就会有一定概率发生ANR,造成后面的捕获器没有机会处理到崩溃。
由于堆栈顺序是初始化的倒序,则大概率最后初始化的SDK捕获到的崩溃会偏多,那初始化偏前面的则有可能受到前序SDK的影响。因此,如果把UAPM的SDK放到初始化最后时则可能UAPM收到的崩溃比其他SDK多。如果把UAPM的SDK 放到初始化前序,则可能UAPM收到的崩溃比其他的少。
另外当其他SDK不向下传递崩溃时,如果UAPM初始化在他们前面则也会出现UAPM无法收到崩溃的情况。
因此我们强烈建议大家把UAPM放在初始化的最后,以确保我们收到的崩溃符合预期。同时我们也建议大家不要多个监控崩溃SDK在APP内并存,在并存情况下,会由于其他SDK捕获机制的原因影响UAPM 收到崩溃信息。
iOS
iOS 通过注册mach异常捕获函数、cpp异常处理函数、OC 异常处理函数及信号异常处理函数对iOS的异常进行全面的捕获。
通常比较常见的是UAPM和Bugly共存,和安卓相似也会有初始化前后影响,当UAPM在bugly前初始化时,如果一个崩溃先被bugly捕获,他们不会向下传递崩溃,因此会导致UAPM无法收到崩溃,因此我们会建议大家最后初始化UAPM,以便UAPM先捕获崩溃,并将信号传递给其他的捕获器;
另一方面,通常ios的崩溃捕获SDK 都会有轮询机制(通过多次或延时重复注册信号处理函数),则不管谁先初始化,都可能受到轮询机制的影响,重复注册信号处理函数会覆盖掉之前的信号处理函数,从而获得优先处理异常信号的机会,因此也会在同时使用多个崩溃捕获SDK时出现某个比另一个多/少,或者采集不到的问题;
以上就是关于崩溃捕获相关的原理内容,我们还是建议大家在并行测试后,只选择一个崩溃监控产品 ,以减少多个崩溃监控共存带来的干扰;