有缘看到这个网页,虽然没有深刻的描述错误的类型,但是简单的讲述了错误的概念,
http://www.xcodechina.com/archiver/?tid-138.html
懒得看看原网页看下面也行:
IOS 的崩溃捕获可以让已经上架或是交给客户使用的APP,当遇到不幸崩溃时可以收集到一些当前的状态,提交给开发人员方便找到错误。 所以简单的介绍一下原理,如果想直接使用的可以找第三方库或是其他推广平台的sdk,但如果是想为自己产品或是已经有现成的bug分析服务器的人可以参考一下并自己加强。
一般造成我们APP崩溃大致可分为二类,一种是语言逻辑类的错误所造成的(如野指针,内存访问异常,重复释放)等,另一类是未捕获异常(Uncaught Exception)。所以我们都要对这二类来进行捕获,IOS本身的SDK 有提供一个函数 NSSetUncaughtExceptionHandler 用来做异常处理,不过并没有将所有的异常捕获,对于第一类的崩溃,IOS本身也是属于UNIX系统,所以会用信号的方式发送出来。
列出几种信号
SIGABRT 一般相同指针free()二次就会产生此一信号或是调用了abort()函式
SIGFPE 错误的算术操作,一般皆是除以零造成的
SIGSEGV 使用指针在一个无效的物理地址上存取值,此信号为Segment错误,比如 char *p = null; *p=1;
SIGBUS a)硬件故障
b)执行malloc()时,如果没有足够的内存,将会发出这信号
c)在有对齐位上的要求上,于对齐位的字节边界上取数据
此种信号指的都是(Bus Error)
SIGTRAP 相关的硬件异常,一般都是发生在调试异常,设置了一个 trap但相关的异常发生会发送此信号
SIGTERM kill被缺省发送,请求中止进程
SIGKILL 无法处理或忽略的错误,中止每一个进程
所以可以在APP的开始加上我们自己的捕获崩溃函式,一般加在didFinishLaunchingWithOptions里
void MyUncaughtHandler(NSException *exception)
{
//补抓到后该做什么处理
}
void MyCrashHandler(int signal)
{
//补抓到后该做什么处理
}
void InitUnexcepationCrashReport
{
//捕获第一类 错误信号
signal(SIGABRT , MyCrashHandler);
signal(SIGFPE , MyCrashHandler);
signal(SIGSEGV , MyCrashHandler);
signal(SIGBUS , MyCrashHandler);
signal(SIGTRAP , MyCrashHandler);
signal(SIGTERM , MyCrashHandler);
signal(SIGKILL , MyCrashHandler);
//捕获第二类 UiKit 未能处理的异常
NSSetUncaughtExceptionHandler (&MyUncaughtHandler);
}