iOS crash捕获异常崩溃日志

ios-一个iOS调试工具,监控所有HTTP请求,自动捕获Crash分析。.zip 一个iOS调试工具,监控所有HTTP请求,自动捕获Crash分析。 1.当出现功能异常时,有很大可能是与服务器的接口交互有数据异常,不管是客户端参数传错还是服务器返回结果错误,都不需要连接电脑调试了,只要打开debug工具就可以观察每次http/https请求的信息了,测试人员都可以使用哦,极大的提交了查找问题的效率! 2.自动捕获Crash日志,不需要再为不是必现得crash而头疼了,一看就了解问题所以,工具会显示crash的堆栈信息。 3.打印系统日志,NSLog输出的log可以在DebugTool中及时查看,解决了只能连接电脑调式才能看到log,大大的方便咯。 立即下载

在APP发布到线上后,会出现用户使用时闪退的糟糕情况。为了改进用户体验,就需要收集app崩溃的日志信息,来完善应用。
像数组越界、字典操作对象值为nil等都会发出一般异常,利用 NSSetUncaughtExceptionHandler就能捕获。但是像访问错误内存块、引用野指针等抛出的是Signal,需要做Signal处理。
下面是捕获处理这两种异常的代码:

首先,在application:(UIApplication *)application didFinishLaunchingWithOptions:方法里添加一个异常捕获的入口函数:RegisterExceptionHandler();

下面是自建CatchCrash类:

#import <Foundation/Foundation.h>

@interface CatchCrash : NSObject

//注册异常捕获
void RegisterExceptionHandler(void);

@end

。m里:

#import "CatchCrash.h"
#include <libkern/OSAtomic.h>
#include <execinfo.h>
#define CRASHREASON @"crashReason"
volatile int32_t exceptionNumber = 0;
const int32_t exceptionMaximum = 10;
@implementation CatchCrash

//获取堆栈信息
+ (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;
}

#pragma mark 异常处理
- (void)handleException:(NSException *)exception{

    NSSetUncaughtExceptionHandler(NULL);
    signal(SIGABRT, SIG_DFL);
    signal(SIGILL, SIG_DFL);
    signal(SIGSEGV, SIG_DFL);
    signal(SIGFPE, SIG_DFL);
    signal(SIGBUS, SIG_DFL);
    signal(SIGPIPE, SIG_DFL);


    //捕获到异常后处理
    NSArray *callStack = [[exception userInfo]objectForKey:@"UncaughtExceptionHandlerAddressesKey"];
    NSString *reason = [exception reason];
    NSString *name = [exception name];

    //错误信息
    NSString *crashContent = [NSString stringWithFormat:@"crashName:%@ AND crashReason:%@ AND callStackSymbols:%@",name,reason,[callStack componentsJoinedByString:@"\n"]];


    /*
    //IMEI
    //手机型号
    //报错日期
    //系统版本
    */

    //有效信息自行拼接
    NSString *message = [NSString stringWithFormat:@"%@", crashContent];
    NSLog(@"*****崩溃信息log : \n%@\n",message);

    //本地存储
    NSUserDefaults *crashUser = [NSUserDefaults standardUserDefaults];
    NSString *crashPreviousContent = [crashUser objectForKey:CRASHREASON];
    if (crashPreviousContent && crashPreviousContent.length > 0) {
        [crashUser setObject:[NSString stringWithFormat:@"%@||%@", crashPreviousContent, message] forKey:CRASHREASON];
    } else {
        [crashUser setObject:message forKey:CRASHREASON];
    }
    [crashUser synchronize];

    if ([[exception name] isEqual:@"UncaughtExceptionHandlerSignalExceptionName"])
    {
        kill(getpid(), [[[exception userInfo] objectForKey:@"UncaughtExceptionHandlerSignalKey"] intValue]);
    }
    else
    {
        [exception raise];
    }
}

@end

#pragma mark 注册异常处理
void RegisterExceptionHandler(void)
{
    NSSetUncaughtExceptionHandler(&handleException);

    signal(SIGABRT, signalHandler);
    signal(SIGILL, signalHandler);
    signal(SIGSEGV, signalHandler);
    signal(SIGFPE, signalHandler);
    signal(SIGBUS, signalHandler);
    signal(SIGPIPE, signalHandler);
}

#pragma mark 普通异常处理
//处理exception报错
void handleException(NSException *exception)
{
    int32_t exceptionCount = OSAtomicIncrement32(&exceptionNumber);
    if (exceptionCount > exceptionMaximum)
    {
        return;
    }

    NSArray *callStack = [CatchCrash backtrace];
    NSMutableDictionary *userInfo =
    [NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];
    [userInfo setObject:callStack forKey:@"UncaughtExceptionHandlerAddressesKey"];

    [[[CatchCrash alloc] init]
     performSelectorOnMainThread:@selector(handleException:)
     withObject:[NSException exceptionWithName:[exception name]reason:[exception reason]userInfo:userInfo]waitUntilDone:YES];
}

#pragma mark 异常信号处理
//处理signal报错
void signalHandler(int signal)
{
    int32_t exceptionCount = OSAtomicIncrement32(&exceptionNumber);
    if (exceptionCount > exceptionMaximum)
    {
        return;
    }

    NSMutableDictionary *userInfo =
    [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal]forKey:@"UncaughtExceptionHandlerSignalKey"];

    NSArray *callStack = [CatchCrash backtrace];
    [userInfo setObject:callStack forKey:@"UncaughtExceptionHandlerAddressesKey"];

    [[[CatchCrash alloc] init]
     performSelectorOnMainThread:@selector(handleException:)
     withObject:[NSException exceptionWithName:@"UncaughtExceptionHandlerSignalExceptionName"
                                        reason:[NSString stringWithFormat:@"Signal %d was raised.",
                                                signal]userInfo:userInfo]waitUntilDone:YES];
}

如果有需要,还可以在以上的代码基础上进行拓展,比如可以把存在本地的crash日志,在APP下次启动时发送给服务器,供开发者参考。

iOS程序异常crash捕获与拦截 NULL 博文链接:https://aijiawang-126-com.iteye.com/blog/2096044 立即下载

相关推荐

iOS开发如何自己捕获Crash

为了在iOS捕获和处理未捕获的Objective-C异常和系统信号引起的崩溃,可以使用`NSSetUncaughtExceptionHandler`和标准的Unix信号处理机制来实现。这能帮助你记录绝大部分的崩溃信息。

C_philadd的博客 761

一文读懂iOS中的Crash捕获、分析以及防治

对于iOS端开发,定位和解决Crash毕竟两个流程,首先是根据线索来分析和定位问题,得到一个大概的猜想,之后按照自己的猜想去提供外部条件,来尝试复现问题,如果问题能够成功复现并复原与线程问题相似的堆栈现场,则基本完成了90%的工作,剩下的10%才是修复此问题。对于crash比例极低的,例如没有版本相关性的,对我们的应用影响极小的,我们可以通过去做AB实验尝试去修复。2.bad_access的排查途径有哪些?3.什么情况下会产生bad_access?

黑码哥的技术博客 1万+

获取Android和iOS崩溃日志的方法

App测试过程中难免会遇到崩溃,本文介绍一些常用的获取崩溃的方法

adorable_的博客 3255

iOS开发:Crash异常总结与捕获

在APP用户量达到一定基数的时候,用户在使用应用的期间,或多或少的会碰到一些致使程序闪退的情况,而我们需要将这些情况收集起来。 一般情况下,应用程序发生闪退是,通常都会采用第三方平台进行统计分析,例如: 1、友盟 2、Flurry 3、Crashlytics 而这篇博客讲的是如何利用苹果自身的sdk 【NSException】进行捕获收集这些闪退信息。 说到异常...

chenzimin_blog 7722

iOS 崩溃捕获:使用 NSSetUncaughtExceptionHandler

iOS 开发中,应用崩溃是一个常见且严重的问题。为了提升用户体验,开发者需要了解如何捕获和处理崩溃信息,从而进行调试和改进。NSSetUncaughtExceptionHandler 是一种简单有效的方式来捕获未处理的异常并进行相应处理。

qq_43673244的博客 885

漫谈iOS Crash收集框架

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

麦峰强的博客 1462

iOS之深入解析崩溃Crash的收集调试与符号化分析

一、Crash 类型 Crash 一般产生自 iOS 的微内核 Mach,然后在 BSD 层转换成 UNIX SIGABRT 信号,以标准 POSIX 信号的形式提供给用户。NSException 是使用者在处理 App 逻辑时,用编程的方法抛出。 iOS 端的 Crash 分为三类: Mach 异常:EXC_CRASH; UNIX 信号:SIGABRT; 系统崩溃而引起的程序 NSException 异常退出。 二、iOS 中的崩溃类型 ① EXC_BAD_ACCESS 在

╰つ栺尖篴夢ゞ 1万+

iOS开发~Crash优化

一、概要 iOS App开发中和上线后,都会遇到程序异常退出的情况,导致崩溃的原因有很多,如果是在调试的过程中,可以通过设施断点或者打印关键信息的方式来进行调试,如果对于一些复杂模块非必现的异常崩溃,这种方式有时难以定位问题,而且对于已经发布上线的应用,这种方式更是无能为力。下面详细讨论崩溃产生的原因以及如何处理。 二、Crash捕获 1、Crash产生原因 1、应用中有Bug。 2、Watchdog 超时机制 3、用户强制退出 4、低内存终止 5、其他违反系统规则的操作,大部分是内存问题 .

阿福的专栏 1068

iOS 获取crash日志

在项目上架到App Store以后,谁也不能保证没有一个错误,可能在测试期间连测试人员都没有发现的隐藏小bug在上线之后被用户发现了,这就无疑给用户造成了困扰。所以作为开发人员,要及时的收集这些crash日志信息。这里我用了一种方法,就是当应用在用户使用时发生崩溃现象,会获取到崩溃日志,然后调起邮箱让用户通过邮件发送给我们。具体代码如下:#pragma mark - 获取异常日志- (void)i

岁月静好,善待时光。 907

捕获系统异常崩溃的方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34242331的博客 534

ioscrash崩溃--------LSSafeProtector

LSSafeProtector 是一个可快速集成但功能强大的防止crash库,不改变原代码支持KVO自释放,可以检测到dealloc时未释放的kvo,等19种crash,使用Objective-C编写.可以让程序出现异常的时候不闪退,提高程序的健壮性。 推荐使用 CocoaPods 安装。 在 Podfile 中添加 pod 'LSSafeProtector'。 执行 pod install...

小天空的博客 2045

浅谈 iOS Crash(一)

一、捕获iOS Crash1、设置异常断点并运行 设置异常断点.png说明:设置Xcode异常断点后运行程序,发生Crash时,断点会定位到出错的代码行,但仅适用于开发阶段。线上APP的Crash还需要通过收集Crash机制来捕获Crash并记录在日志中。2、Mach异常 和 Unix信号iOS Crash发生时,先产生Mach异常(最底层的内核级异常),然后Mach异常在host层被ux_...

lvlei19911108的博客 267

iOS crash分析

iOS crash分析 符号化(symbolicate) 内存地址的解析, 是指从 内存地址 到 符号。 Thread 21 Crashed: 0 libsystem_kernel.dylib 0x00000001957b3270 0x195798000 + 111216 1 libsystem_pthread.dylib 0x00...

diaoju3333的博客 283

iOS Crash日志 收集

今天在微信公众号上看到一篇文章,做一下简化整理,大家可以尝试一起来做一下自己的Crash日志记录 开发iOS应用,解决Crash问题始终是一个难题。Crash分为两种,一种是由EXC_BAD_ACCESS引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存;另一种是未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃。其实对...

weixin_34205076的博客 98

iOS Crash

不需要通过dSYM来符号化crash。 注册监控: void InstallUncaughtExceptionHandler(void) { NSSetUncaughtExceptionHandler(&HandleException); } 监控处理: void HandleException(NSException *exception) { ...

xiao898012983的专栏 114

iOS你不知道的事--Crash分析

本文转载于:作者:Cooci_和谐学习_不急不躁 链接:www.jianshu.com/p/56f96167a… 大家平时在开发过程中,经常会遇到Crash,那也是在正常不过的事,但是作为一个优秀的iOS开发人员,必将这些用户不良体验降到最低。 线下Crash,我们直接可以调试,结合stack信息,不难定位! 线上Crash当然也有一些信息,毕竟苹果爸爸的产品还是做得非常不错的! 通过i...

weixin_30507481的博客 126

iOS crash分析

文章目录异常的捕捉埋点 开发iOS应用,解决Crash问题始终是一个难题。Crash分为两种,一种是由EXC_BAD_ACCESS引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存;另一种是未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃。其实对于未捕获的Objective-C异常,我们是有办法将它记录下来的,如果日志...

煮酒Shae 533

经营你的iOS应用日志(二):异常日志

原文地址:http://www.cnblogs.com/alario/ 如果你去4S店修车,给小工说你的车哪天怎么样怎么样了,小工有可能会立即搬出一台电脑,插上行车电脑把日志打出来,然后告诉你你的车发生过什么故障。汽车尚且如此,何况移动互联网应用呢。 本文第一篇:经营你的iOS应用日志(一):开始编写日志组件   言归正传。开发iOS应用,解决Crash问题始终是一个难题。Crash

591
上一篇: iOS捕捉截屏事件并展示截图
下一篇: iOS SRWebSocket原理分析及API使用
SL_ideas
博客等级 码龄9年 16粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值