1、以下这些代码,放到AppDelegate的 @ implementation 之前。
#include <libkern/OSAtomic.h>
#include <execinfo.h>
// 系统信号截获处理方法
void signalHandler(int signal);
// 异常截获处理方法
void exceptionHandler(NSException *exception);
const int32_t _uncaughtExceptionMaximum = 10;
2、以下这些代码,放到AppDelegate 中。
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 = [AppDelegate 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 = [AppDelegate backtrace];
NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];
[userInfo setObject:callStack forKey:@"ExceptionHandlerAddressesKey"];
// 现在就可以保存信息到本地[]
NSArray *callStackSymbols = [exception callStackSymbols];
NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@"\n"];
NSString *reason = [exception reason];
NSString *name = [exception name];
DDLogError(@"异常 >>");
DDLogError(@"异常名称:%@",name);
DDLogError(@"异常原因:%@",reason);
DDLogError(@"堆栈标志:%@",callStackSymbolStr);
DDLogError(@"异常 <<");
}
//获取调用堆栈
+(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);
}
3、在 didFinishLaunchingWithOptions方法的开头写如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
installExceptionHandler();
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
注:
signalHandler 和 exceptionHandler 里面的内容可以删减,写自己的方法。
转自:
http://blog.csdn.net/daiyelang/article/details/17020211
分享到:
相关推荐
iOS异常捕捉提示,发送邮件及写入异常日志。 提供 断言, 错误的具体位置(类名及行数)、所有异常报告内容、及异常报告文件路径接口。 并统一展示 异常日志 。
iOS异常捕捉提示,发送邮件及写入异常日志。 提供 断言, 错误的具体位置(类名及行数)、所有异常报告内容、及异常报告文件路径接口。 并统一展示 异常日志 。
iOS异常捕获和崩溃日志 欢迎关注 http://blog.csdn.net/u014220518/article/details/53522239
这个方法类可以主动捕捉异常并上传到分发到服务器
本Demo主要是实现了iOS捕获程序异常崩溃,然后将崩溃信息提交到服务器,这些信息包括崩溃信息,操作系统信息等
本demo只是简单的演示一个异常捕获,具体使用还需要看你的项目实际需求
主要用于NSException 异常的捕捉,可以捕获对应的异常。
添加UncaughtExceptionHandler这个类 iOS SDK提供的函数是NSSetUncaughtExceptionHandler来进行异常处理。但是无法处理内存访问错误、重复释放等错误,因为这些错误发送的SIGNAL。所以需要处理这些SIGNAL
通过应用程序委托中调用[[AppExceptionHandler shareAppExceptionHandler] start];来开启异常捕获;
– 捕捉异常信息 【解析都写在注释中了】 示例代码 - (void)redirectNSLogToDocumentFolder { //如果已经连接Xcode调试则不输出到文件 //该函数用于检测输出 (STDOUT_FILENO) 是否重定向 是个 Linux 程序方法 if...
NULL 博文链接:https://aijiawang-126-com.iteye.com/blog/2096044
unity 捕捉异常和移动设备崩溃Android
NdUncaughtExceptionHandler 异常捕捉
操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...
一个iOS调试工具,监控所有HTTP请求,自动捕获Crash分析。 1.当出现功能异常时,有很大可能是与服务器的接口交互有数据异常,不管是客户端参数传错还是服务器返回结果错误,都不需要连接电脑调试了,只要打开...
让APP 运行时拥有防 Crash 功能能有效降低 Crash 率,提升 APP 稳定性
UncaughtExceptionHandler:一个iOS崩溃异常的捕捉处理源代码,帮助更好的调试程序
1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作 代码如下: NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler); 官方文档介绍:Sets the top-level error-handling function where...
“如果某个实体表现出以下任何一种特性,它就具备自主性:自我修复、自我保护、自我维护、对目标的自我...首先要检测用户App出现了连续闪退的情况,有两种检测方法,捕获异常和计时器。检测连续闪退,可以通过捕获异常