🐻监控 -- iOS降低崩溃率的秘密

2,543 阅读3分钟

揪心的bug

我们通过第三方工具分析捕获 mach信号或unix信号获取崩溃信息,但有时明明查到了具体的崩溃地点,确觉得这行代码似乎找不出问题。

比如:

image.png

崩溃无法复现,我们只能尝试解决这个问题,探索可能出现的步骤;

这个问题可能就不了了之了,崩溃率也就居高不下。

那有没有一个办法可以记录下来用户的操作步骤用于复现呢?可不可以记录现场?答案是肯定的。

于是我花了一天的时间写了这款工具:KillBug 欢迎star✨哦

bugtags 中也有KillBug的功能。我们之前使用过,并成功的把崩溃率降低到了十万分之一。用户交互日志功不可没。

此工具用来收集用户操作步骤:

  • 1、可用于bug复现,问题排查,监控:iOS降低崩溃率到万分之一以内的秘密
  • 2、分析用户操作日志

采用 runtime method swizzle 实现,为了不影响app的启动速度,method swizzle 需要手动开启。

支持Swift、OC以及混编项目。

支持采集如下内容:

/// UIControl
- (void)trackEventView:(UIView *)view;

/// tableview&collectionview
- (void)trackEventView:(UIView *)view withIndexPath:(nullable NSIndexPath *)indexPath;

/// viewWillAppear
- (void)trackViewWillAppear:(UIViewController *)controller;

/// uiapplication 活跃状态
- (void)trackApplication:(NSString *)state;

/// uiapplication 死亡信息
- (void)trackApplicationDeadReason:(NSString *)reason;

/// 用户的touch事件
- (void)trackTouch:(NSString *)info;

/// 日志回调
- (void)debugInfoHandler:(DebugInfoHandler)handler;

使用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    KBAutoTrackManager *manager = [KBAutoTrackManager shared];
    [manager debugInfoHandler:^(NSString * _Nonnull info) {
        NSLog(@"%@", info);
        /// Custom 
    }];
    return YES;
}

kill bug

可以配合firebase

/// 异步延迟处理,避免影响首屏加载速度
        DispatchQueue.main.asyncAfter(deadline: .now()+3) {
            KBAutoTrackManager.shared().debugInfoHandler { (info) in
                /// 传给 Crashlytics
                debug(info)
                Crashlytics.crashlytics().log(info)
            }
        }

这样firebase在抓到崩溃的同时,也能采集到用户的交互日志:

firebase上是这样的:

14321617090757_.pic_hd.jpg

配合堆栈信息,我想问还有什么bug是无法解决的呢?

如果是传到自己服务器,那就得自己处理采集的崩溃日志了。

log 日志

2021-03-30 11:20:53.215736+0800 KillBug_Example[962:142129] will appear: KBViewController
2021-03-30 11:20:53.265620+0800 KillBug_Example[962:142129] app state: 已经活跃
2021-03-30 11:20:54.720428+0800 KillBug_Example[962:142129] touch: 单击 位置 x:245.333328 y:629.333328
2021-03-30 11:20:54.761609+0800 KillBug_Example[962:142129] will appear: KBViewControllerA
2021-03-30 11:20:59.767387+0800 KillBug_Example[962:142129] touch: 单击 位置 x:138.333328 y:35.333328
2021-03-30 11:20:59.767880+0800 KillBug_Example[962:142129] touch: 单击 位置 x:138.333328 y:35.333328
2021-03-30 11:20:59.776511+0800 KillBug_Example[962:142129] click: UITableView row: 4 section: 0
2021-03-30 11:21:06.493889+0800 KillBug_Example[962:142129] touch: 单击 位置 x:261.000000 y:645.333328
2021-03-30 11:21:09.982150+0800 KillBug_Example[962:142129] click: UIButton txt:ButtonA
2021-03-30 11:21:14.463084+0800 KillBug_Example[962:142129] click: UIButton txt:小明
2021-03-30 11:21:17.768582+0800 KillBug_Example[962:142129] app state: 将非活跃
2021-03-30 11:21:18.677035+0800 KillBug_Example[962:142129] app state: 已进入后台
2021-03-30 11:21:23.629401+0800 KillBug_Example[962:142129] app state: 将进入前台
2021-03-30 11:21:23.954509+0800 KillBug_Example[962:142129] app state: 已经活跃
2021-03-30 11:21:25.641821+0800 KillBug_Example[962:142129] click: UIButton txt:崩溃测试
2021-03-30 11:21:25.643086+0800 KillBug_Example[962:142129] app crash: {
  "appException" : {
    "exceptionreason" : "*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]",
    "exceptionname" : "NSRangeException"
  }
}

也可以上传到自己服务器。

支持pod

pod 'KillBug'

runtime 部分有详细注释,欢迎提交issue!

KillBug 欢迎star✨哦