奔溃信息分类
可以通过信号捕获的崩溃信息:数组越界,野指针问题,NSNotification线程问题,KVO 问题
无法被信号捕获的奔溃信息:后台任务超时、内存超出限制、主线程卡顿超阈值
通过信号捕获的崩溃信息
1、一般使用bugly全局监听,获取崩溃信息。
信号量捕获实现代码如下
// 注册signalHandler
void registerSignalHandler(void) {
signal(SIGSEGV, handleSignalException);
signal(SIGFPE, handleSignalException);
signal(SIGBUS, handleSignalException);
signal(SIGPIPE, handleSignalException);
signal(SIGHUP, handleSignalException);
signal(SIGINT, handleSignalException);
signal(SIGQUIT, handleSignalException);
signal(SIGABRT, handleSignalException);
signal(SIGILL, handleSignalException);
}
// 打印捕获到的崩溃信息
void handleSignalException(int signal) {
NSMutableString *crashString = [[NSMutableString alloc]init];
void* callstack[128];// 指针数组
// backtrace()函数用与获取当前线程的调用堆栈,获取的信息将会被存放在callstack中
int i, frames = backtrace(callstack, 128);
// backtrace_symbols()将从backtrace函数获取的信息转化为一个字符串数组.
char** traceChar = backtrace_symbols(callstack, frames);
for (i = 0; i <frames; ++i) {
[crashString appendFormat:@"%s\n", traceChar[i]];
}
NSLog(crashString);
}
2、常见的异常编码
- 0x8badf00d,表示 App 在一定时间内无响应而被 watchdog 杀掉的情况。(主线程被卡)
- 0xdeadfa11,表示 App 被用户强制退出。
- 0xc00010ff,表示 App 因为运行造成设备温度太高而被杀掉。
3、在bugly上可以查看到引起奔溃的系统,机型等信息。以及出现奔溃影响的用户数量。根据影响用户数量由大到小排列,优先解决影响面大的。
降低崩溃方式
pod导入SafeKit,无需修改代码降低奔溃发生。
主要针对:数组,字典,可变数组,可变字典,字符串。处理数组越界, 野指针。
创建对应的分类,在分类的load方法中进行方法替换处理。load方法在main() 函数执行前已经完成。
核心代码如下:
// 进行系统方法替换
+ (void)safe_swizzleMethod:(Class)srcClass srcSel:(SEL)srcSel tarClass:(Class)tarClass tarSel:(SEL)tarSel{
if (!srcClass) {
return;
}
if (!srcSel) {
return;
}
if (!tarClass) {
return;
}
if (!tarSel) {
return;
}
// class_getInstanceMethod获取类中的方法
Method srcMethod = class_getInstanceMethod(srcClass,srcSel);
Method tarMethod = class_getInstanceMethod(tarClass,tarSel);
// 将系统的类中方法替换成已经进行安全处理的方法
method_exchangeImplementations(srcMethod, tarMethod);
}
网友评论