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
分享到:
相关推荐
3. 实现异常捕获和处理的回调方法。 4. 将异常信息记录并保存。 5. 可选:集成邮件发送功能,当异常发生时自动发送报告。 通过以上介绍,我们可以看到`ExceptionHandler`在iOS开发中的重要性,它可以帮助我们更有效...
总结来说,iOS异常捕获和崩溃日志处理是提升应用质量不可或缺的环节。利用如ZFJUncaughtExceptionHandler这样的工具,可以有效地记录和分析崩溃信息,从而快速定位和修复问题,提供更稳定的用户体验。对于开发者而言...
在iOS开发中,异常捕捉和处理是至关重要的环节,它能确保应用在遇到错误时能够稳定运行,并且为开发者提供有价值的错误信息以便于调试。`ExceptionHandler`是一个专门用于捕获和处理iOS应用中的异常的机制。这个机制...
1. **异常捕获**:通过注册异常处理器,当异常发生时,系统会调用我们设定的处理程序。 2. **异常信息收集**:在处理程序中,我们需要收集异常的详细信息,包括异常名称、原因、堆栈轨迹等,这些信息对于定位问题...
在iOS应用开发中,异常捕获是至关重要的一个环节,它可以帮助开发者在程序崩溃时获取必要的信息,以便分析和修复问题。"iOS开发异常捕获上传至邮箱"这个标题所涉及的知识点主要涵盖如何在iOS应用程序中实现异常监控...
"iOS捕获程序异常崩溃记录、App信息等"这一主题就是关注如何在iOS应用中实现这样的功能。通过创建自定义的崩溃捕获机制,并将相关信息上传至服务器,我们可以获取详细的崩溃日志和系统信息,从而更好地诊断和解决...
- **异常捕获**:在关键代码段使用`@try`、`@catch`来捕获异常,提供备用逻辑或用户提示。 - **记录日志**:在异常处理器中记录详细的错误信息,便于后续排查问题。 - **使用第三方库**:考虑集成如Fabric/...
二、异常捕获 1. 自定义异常处理:通过在代码中添加@try/@catch结构,可以捕获并处理异常。但这种方法只适用于知道可能出现异常的特定代码段。 2. 主线程异常处理:由于大部分用户交互发生在主线程,确保主线程不...
"IOS 异常崩溃时发送邮件"这个主题正是关于如何在iOS应用出现异常时,自动捕获异常信息并通过电子邮件发送到指定地址,以便于调试。 首先,我们需要了解`NSSetUncaughtExceptionHandler`这个函数。它是Objective-C...
总结来说,iOS异常处理主要是通过异常捕获和处理来增强应用的健壮性。`AppExceptionHandler`类提供了一种便捷的方式来全局监控和处理应用中的异常,帮助开发者更好地调试和维护应用。通过学习和应用这些技术,可以...
"ios异常处理问题"这一主题关注的是如何有效地检测和处理这些异常,以防止程序的非预期终止。 在Objective-C和Swift这两种主要的iOS编程语言中,异常处理机制有所不同。在Objective-C中,异常是通过`@try`、`@catch...
添加UncaughtExceptionHandler这个类 iOS SDK提供的函数是NSSetUncaughtExceptionHandler来进行异常处理。但是无法处理内存访问错误、重复释放等错误,因为这些错误发送的SIGNAL。所以需要处理这些SIGNAL
在iOS应用开发中,异常处理是一项至关重要的任务,它能够帮助开发者及时捕获并处理程序运行过程中的错误,提升用户体验,同时也有助于开发者更好地诊断和修复问题。本篇文章将详细探讨如何在iOS应用程序中实现异常...
在实际应用中,为了提高用户体验,还可以结合崩溃报告库,如Android的ACRA(Application Crash Report for Android)或iOS的Fabric的Crashlytics,它们提供了一套完整的异常捕获、本地存储、上传和分析的解决方案。...
"unity 捕捉异常和移动设备崩溃Android"这个主题聚焦于如何在Unity引擎中有效地管理和处理异常,以及如何针对Android设备上的游戏崩溃进行调试。下面我们将深入探讨相关知识点。 一、Unity异常处理基础 在Unity中,...
在iOS开发中,异常处理是确保程序稳定性和用户体验的关键部分。`NdUncaughtExceptionHandler` 是一个自定义的未捕获异常处理程序,用于在应用程序中处理那些没有被正常捕获的异常情况。当一个异常在主线程或者任何...
异常捕获 在 iOS 中,捕获异常可以通过 NSSetUncaughtExceptionHandler 函数来实现。NSSetUncaughtExceptionHandler 函数可以设置一个顶级错误处理程序,在程序终止之前可以获取到崩溃信息,并执行相应的操作,...
"ios-iOS捕获崩溃日志.zip"这个压缩包提供了相关的解决方案,尤其是对于Swift项目。 首先,描述中提到的Swift扩展库——ZCategoryTool,是由CoderZCC开发的一个开源工具,它支持通过CocoaPods进行集成。CocoaPods是...
Mach异常是最底层的内核级异常,是指在iOS系统的内核层中发生的异常。Mach异常可以是EXC_BAD_ACCESS(内存访问异常)等。Mach异常是通过Mach API暴露给用户态的,可以直接通过Mach API设置thread、task、host的异常...