揪心的bug
我们通过第三方工具分析捕获 mach信号或unix信号获取崩溃信息,但有时明明查到了具体的崩溃地点,确觉得这行代码似乎找不出问题。
比如:
崩溃无法复现,我们只能尝试解决这个问题,探索可能出现的步骤;
这个问题可能就不了了之了,崩溃率也就居高不下。
那有没有一个办法可以记录下来用户的操作步骤用于复现呢?可不可以记录现场?答案是肯定的。
于是我花了一天的时间写了这款工具: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上是这样的:
配合堆栈信息,我想问还有什么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!