iOS 抓取崩溃信息
抓取崩溃信息
友盟
- 使用友盟,省时省力
自己写
-
如果不能用第三方的,只能自己抓取,上传到自己的服务器
-
在appDelegate里做初始化
// 加入crash handler
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// 模拟错误信息
// NSArray *array = [NSArray arrayWithObject:@"0"];
// NSLog(@"%@", [array objectAtIndex:1]);
/**
* 实现NSUncaughtExceptionHandler方法
*/
void uncaughtExceptionHandler(NSException *exception)
{
// 调用堆栈
NSArray *arr = [exception callStackSymbols];
// 错误reason
NSString *reason = [exception reason];
// exception name
NSString *name = [exception name];
// 根据自己的需求将crash信息记录下来,下次启动的时候传给服务器。
// 尽量不要在此处将crash信息上传,因为App将要退出,不保证能够将信息上传至服务器
[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"isException"];
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"callStackSymbols"];
[[NSUserDefaults standardUserDefaults] setObject:reason forKey:@"reason"];
[[NSUserDefaults standardUserDefaults] setObject:name forKey:@"name"];
}
- 然后在合适的时间把这个信息上传到服务器,上传成功后改
isException
为YES
Exception codes
0x8badf00d错误码:Watchdog超时,意为“ate bad food”。
0xdeadfa11错误码:用户强制退出,意为“dead fall”。
0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。
0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。
0xc00010ff错误码:因为太烫了被干掉,意为“cool off”。
0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”。
Exception types
- 查看我们的crash分析报告邮件,会发现最经常遇到的错误类型是SEGV(Segmentation Violation,段违例),表明内存操作不当,比如访问一个没有权限的内存地址。
- 当我们收到SIGSEGV信号时,可以往以下几个方面考虑:
- 访问无效内存地址,比如访问Zombie对象;
- 尝试往只读区域写数据;
- 解引用空指针;
- 使用未初始化的指针;
- 栈溢出;
- 此外,还有其它常见信号:
- SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;
- SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);
- SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;
- SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;
- SIGPIPE:管道另一端没有进程接手数据;
本文来自博客园,作者:struggle_time,转载请注明原文链接:https://www.cnblogs.com/songliquan/p/12784546.html