IOS Crash捕获

IOS Crash ,就两种情况:一种是异常,另一种是中断[信号量]。

#include <libkern/OSAtomic.h>

#include <execinfo.h>

// 系统信号截获处理方法

void signalHandler(int signal);

// 异常截获处理方法

void exceptionHandler(NSException *exception);

const int32_t _uncaughtExceptionMaximum = 10;

void signalHandler(int signal)

{

volatile int32_t _uncaughtExceptionCount = 0;

int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);

if (exceptionCount > _uncaughtExceptionMaximum) // 如果太多不用处理

{

return;

}

// 获取信息

NSMutableDictionary *userInfo =

[NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:UncaughtExceptionHandlerSignalKey];

NSArray *callStack = [ExceptionHandler backtrace];

[userInfo  setObject:callStack  forKey:SingalExceptionHandlerAddressesKey];

// 现在就可以上报信息到服务器

}

void exceptionHandler(NSException *exception)

{

volatile int32_t _uncaughtExceptionCount = 0;

int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);

if (exceptionCount > _uncaughtExceptionMaximum) // 如果太多不用处理

{

return;

}

NSArray *callStack = [ExceptionHandler backtrace];

NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];

[userInfo setObject:callStack forKey:ExceptionHandlerAddressesKey];

// 现在就可以上报信息到服务器

}

@implementation ExceptionHandler

//获取调用堆栈

+ (NSArray *)backtrace

{

void* callstack[128];

int frames = backtrace(callstack, 128);

char **strs = backtrace_symbols(callstack,frames);

NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];

for (int i=0;i<frames;i++)

{

[backtrace addObject:[NSString stringWithUTF8String:strs[i]]];

}

free(strs);

return backtrace;

}

// 注册崩溃拦截

-(void)installExceptionHandler

{

NSSetUncaughtExceptionHandler(&exceptionHandler);

signal(SIGHUP, signalHandler);

signal(SIGINT, signalHandler);

signal(SIGQUIT, signalHandler);

signal(SIGABRT, signalHandler);

signal(SIGILL, signalHandler);

signal(SIGSEGV, signalHandler);

signal(SIGFPE, signalHandler);

signal(SIGBUS, signalHandler);

signal(SIGPIPE, signalHandler);

}

@end

时间: 2024-12-11 13:34:24

IOS Crash捕获的相关文章

iOS异常捕获

文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进?一步分析 五. demo地址 六. 参考文献 前言 今天在ios高级群,有朋友问到iOS的异常捕捉的问题,这一块以前也没有研究过,趁此机会研究了一把.并写了一个demo,如有需要可以在文章最下面去下载. 在阅读文章之前,建议大家在阅读完此篇文章后可以阅读漫谈iOS Crash收集框架,了解一下原理. 开发iOS应用,解决Crash问题始终是一个难题

漫谈iOS Crash收集框架

漫谈iOS Crash收集框架 为了能够第一时间发现程序问题,应用程序需要实现自己的崩溃日志收集服务,成熟的开源项目很多,如 KSCrash,plcrashreporter,CrashKit 等.追求方便省心,对于保密性要求不高的程序来说,也可以选择各种一条龙Crash统计产品,如 Crashlytics,Hockeyapp ,友盟,Bugly 等等. 是否集成越多的Crash日志收集服务就越保险? 自己收集的Crash日志和系统生成的Crash日志有分歧,应该相信谁? 为什么有大量Crash日

Overview of iOS Crash Reporting Tools: Part 1/2

Believe it or not, developers are not perfect, and every once in a while you might have a (gasp!) bug in your app. You will try your best to ship your apps with no bugs in them, but more often than not you realise afterwards that a bug has slipped th

iOS: Crash文件解析(一)

iOS Crash文件的解析(一) 开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断.联想起老罗在发布Smartisan OS的时候说了,他准备了10个手机,如果一台有问题,就换一台,如果10台后挂了他就不做手机了.好了不闲扯了,今天就跟大家一起聊聊iOSCrash文件的组成以及常用的分析工具. 有一个WWDC 2010的视频推荐大家抽空看看,视频名称“Understanding C

iOS Crash 分析 符号化崩溃日志

参考: http://blog.csdn.net/diyagoanyhacker/article/details/41247367 http://blog.csdn.net/diyagoanyhacker/article/details/41247389 http://blog.csdn.net/diyagoanyhacker/article/details/41247411 http://www.cnblogs.com/smileEvday/p/Crash1.html 未符号化的崩溃日志就象一

符号化(Symbolicating) iOS Crash文件

今天有空研究一下如何分析iOS Crash文件. 看了一下网上的方法,有些行不通了.最后拿老大以前写的脚本,可以了. 然后理解了一下脚本,最后稍作修改.整理一下. 脚本(在Mac上面运行): echo dSYM uuid: xcrun dwarfdump --uuid $2.app.dSYM/Contents/Resources/DWARF/$2 echo crashlog uuid: grep $2' armv7' $1 | tr -s " " echo baseaddress: g

iOS-----分析iOS Crash文件:符号化iOS Crash文件的3种方法

iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹果提供的命令行工具,其中一些功能就是查看可执行文件件或库文件的UUID 3. symbolicatecrash 一个苹果提供的脚本.可以将crash日志符号化为可读的堆栈信息. 4. atosl 苹果提供的命令行工具,可以将crash的base_address和load_address转化为可读的堆

iOS crash log 解析

iOS开发中,经常遇到App在开发及测试时不会有问题,但是装在别人的设备中会出现各种不定时的莫名的 crash,因为iOS设备会保存应用的大部分的 crash Log,所以可以通过 crash Log 来定位 crash 原因. 一. 获取iOS设备上的 crash log 1. 将iOS设备连接到电脑上,打开 Xcode -> Organizer -> Devices,找到该台设备,在 Device logs 中找到 crash log(后缀为 .crash 的 log 文件),将其导出即可

iOS Crash 分析(文一)- 开始

iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹果提供的命令行工具,其中一些功能就是查看可执行文件件或库文件的UUID 3. symbolicatecrash 一个苹果提供的脚本.可以将crash日志符号化为可读的堆栈信息. 4. atosl 苹果提供的命令行工具,可以将crash的base_address和load_address转化为可读的堆