您的位置:首页 > 移动开发 > IOS开发

IOS崩溃错误总结

2014-04-24 14:52 260 查看
有缘看到这个网页,虽然没有深刻的描述错误的类型,但是简单的讲述了错误的概念,
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: