crash 捕获

2024-06-05 23:58
文章标签 捕获 crash

本文主要是介绍crash 捕获,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:在.h文件中编写
@interface UncaughtExceptionHandler : NSObject{ 
    BOOL dismissed; 
   
@end 
void HandleException(NSException *exception); 
void SignalHandler(int signal); 
   
   
void InstallUncaughtExceptionHandler(void); 
 
 
//该代码片段来自于: http://www.sharejs.com/codes/objectc/5882
二:在.m文件编写
#import "UncaughtExceptionHandler.h" 
#include <libkern/OSAtomic.h> 
#include <execinfo.h> 
   
//http://www.cocoachina.com/newbie/tutorial/2012/0829/4672.html 
NSString * const UncaughtExceptionHandlerSignalExceptionName = @"UncaughtExceptionHandlerSignalExceptionName"
NSString * const UncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey"
NSString * const UncaughtExceptionHandlerAddressesKey = @"UncaughtExceptionHandlerAddressesKey"
   
volatile int32_t UncaughtExceptionCount = 0; 
const int32_t UncaughtExceptionMaximum = 10; 
   
const NSInteger UncaughtExceptionHandlerSkipAddressCount = 4; 
const NSInteger UncaughtExceptionHandlerReportAddressCount = 5; 
   
@implementation UncaughtExceptionHandler 
   
+ (NSArray *)backtrace 
     void* callstack[128]; 
     int frames = backtrace(callstack, 128); 
     char **strs = backtrace_symbols(callstack, frames); 
        
     int i; 
     NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames]; 
     for 
        i = UncaughtExceptionHandlerSkipAddressCount; 
        i < UncaughtExceptionHandlerSkipAddressCount + 
            UncaughtExceptionHandlerReportAddressCount; 
        i++) 
     
        [backtrace addObject:[NSString stringWithUTF8String:strs[i]]]; 
     
     free(strs); 
        
     return backtrace; 
   
- (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex 
    if (anIndex == 0) 
    
        dismissed = YES; 
    }else if (anIndex==1) { 
        NSLog(@"ssssssss"); 
    
   
- (void)validateAndSaveCriticalApplicationData 
       
   
- (void)handleException:(NSException *)exception 
    [self validateAndSaveCriticalApplicationData]; 
       
    UIAlertView *alert = 
        [[[UIAlertView alloc] 
            initWithTitle:NSLocalizedString(@"抱歉,程序出现了异常", nil) 
            message:[NSString stringWithFormat:NSLocalizedString( 
                @"如果点击继续,程序有可能会出现其他的问题,建议您还是点击退出按钮并重新打开\n\n" 
                @"异常原因如下:\n%@\n%@", nil), 
                [exception reason], 
                [[exception userInfo] objectForKey:UncaughtExceptionHandlerAddressesKey]] 
            delegate:self 
            cancelButtonTitle:NSLocalizedString(@"退出", nil) 
            otherButtonTitles:NSLocalizedString(@"继续", nil), nil] 
        autorelease]; 
    [alert show]; 
       
    CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 
    CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop); 
       
    while (!dismissed) 
    
        for (NSString *mode in (NSArray *)allModes) 
        
            CFRunLoopRunInMode((CFStringRef)mode, 0.001, false); 
        
    
       
    CFRelease(allModes); 
   
    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); 
       
    if ([[exception name] isEqual:UncaughtExceptionHandlerSignalExceptionName]) 
    
        kill(getpid(), [[[exception userInfo] objectForKey:UncaughtExceptionHandlerSignalKey] intValue]); 
    
    else 
    
        [exception raise]; 
    
   
@end 
   
void HandleException(NSException *exception) 
    int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount); 
    if (exceptionCount > UncaughtExceptionMaximum) 
    
        return
    
       
    NSArray *callStack = [UncaughtExceptionHandler backtrace]; 
    NSMutableDictionary *userInfo = 
        [NSMutableDictionary dictionaryWithDictionary:[exception userInfo]]; 
    [userInfo 
        setObject:callStack 
        forKey:UncaughtExceptionHandlerAddressesKey]; 
       
    [[[[UncaughtExceptionHandler alloc] init] autorelease] 
        performSelectorOnMainThread:@selector(handleException:) 
        withObject: 
            [NSException 
                exceptionWithName:[exception name] 
                reason:[exception reason] 
                userInfo:userInfo] 
        waitUntilDone:YES]; 
   
void SignalHandler(int signal
    int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount); 
    if (exceptionCount > UncaughtExceptionMaximum) 
    
        return
    
       
    NSMutableDictionary *userInfo = 
        [NSMutableDictionary 
            dictionaryWithObject:[NSNumber numberWithInt:signal
            forKey:UncaughtExceptionHandlerSignalKey]; 
   
    NSArray *callStack = [UncaughtExceptionHandler backtrace]; 
    [userInfo 
        setObject:callStack 
        forKey:UncaughtExceptionHandlerAddressesKey]; 
       
    [[[[UncaughtExceptionHandler alloc] init] autorelease] 
        performSelectorOnMainThread:@selector(handleException:) 
        withObject: 
            [NSException 
                exceptionWithName:UncaughtExceptionHandlerSignalExceptionName 
                reason: 
                    [NSString stringWithFormat: 
                        NSLocalizedString(@"Signal %d was raised.", nil), 
                        signal
                userInfo: 
                    [NSDictionary 
                        dictionaryWithObject:[NSNumber numberWithInt:signal
                        forKey:UncaughtExceptionHandlerSignalKey]] 
        waitUntilDone:YES]; 
   
void InstallUncaughtExceptionHandler(void
    NSSetUncaughtExceptionHandler(&HandleException); 
    signal(SIGABRT, SignalHandler); 
    signal(SIGILL, SignalHandler); 
    signal(SIGSEGV, SignalHandler); 
    signal(SIGFPE, SignalHandler); 
    signal(SIGBUS, SignalHandler); 
    signal(SIGPIPE, SignalHandler); 
 
 
//该代码片段来自于: http://www.sharejs.com/codes/objectc/5882
三:最后在AppDelegate中创建
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
  InstallUncaughtExceptionHandler(); 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
  self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 
  self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
 
 
//该代码片段来自于: http://www.sharejs.com/codes/objectc/5882
四:最后的测试
- (IBAction)onclcko:(id)sender { 
   //  [alert show]; 
    NSArray *arry=[NSArray arrayWithObject:@"sss"]; 
    NSLog(@"%@",[arry objectAtIndex:1]); 
}

这篇关于crash 捕获的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034533

相关文章

android反馈Crash报告

此文章转载他人,担有所改动,,在全局获取异常有所改动 为什么需要反馈Crash报告?   做Android应用程序,要尽量避免程序Crash的发生。虽然说零Crash是程序员追逐的最终目标,但是现实的情况是,程序员只能尽量的减少Crash的发生,而几乎不可能完全杜绝Crash。也许,你认为你的应用的健壮性已经近乎完美,轻松的经受住了测试部门魔鬼般的考验,但是当你的应用发布到市

行业门户网站如何捕获访客“芳心”

随着互联网的飞速发展,竞争变得越来越激烈,“酒香不怕巷子深”,“牧童遥指杏花村”的时代悄然远去。摆在企业面前的是信息流的挑战,如何在海量的商家信息中使自己企业的宣传推广信息进入消费者的视线,捕获其“芳心”,已成为每一个站长不得不深思的头等大事。   纵观当今社会,广告飞天盖地,不管走到哪里,总能看见不同商家的广告。这让我想起了前几天看到马云说过的一句话,品牌不是靠广告就能砸出来的,品牌靠的更多是

FREERTOS中,队列按键捕获

队列消息获取的按键任务优先级 < 队列消息释放的按键任务优先级 会出现错误,必须先按KEY1,才能按KEY0 解决方法:修改任务的优先级,队列消息获取的按键任务优先级 >  队列消息释放的按键任务优先级

Android 全局异常捕获之CrashHandler,用于开发者收集获取异常信息

一个App上线或者投入到生产环境的时候崩溃了,还不知道是什么原因,这肯定是开发者的痛…所以肯定要加入全局异常捕获,如果项目较大的话,可以考虑加入第三方诸如友盟的崩溃统计插件,以达到异常捕获的效果! Crash,可以理解为崩溃、垮台,通常来讲就是App运行期间发生了不可预料的错误,虽然在经历发布之前,测试人员进行了大量的测试,但是并不能保证App的正常运行,总会或多或少有一些BUG的。 J

java线程捕获异常(案例)

无法捕获的线程异常 public class ExceptionThread implements Runnable { @Override public void run() { throw new RuntimeException(); } public static void main(String[] args) { try { ExecutorServi

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash,都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110 初步分析 拿到coredump后,发现问题

android开发经常碰到的crash(下)

结合拜读包建强前辈著作的《App研发录》,与自己开发过程中遇到的问题,继续上篇对android开发经常碰到的crash探讨。上篇已经对空指针、数组越界、数据类型转换、fragment引用资源出错、dialog关闭报错、adapter数据改变与列表更新不同步、试图调用空对象的方法、列表滚动与刷新冲突报错、栈的无限递归引起栈溢出、多dex分包造成无法找到类定义、手机的CPU架构不同造成无法加载so文件

android开发经常碰到的crash(上)

在拜读包建强前辈著作的《App研发录》过程中,我深有感触。因为在书中提到的一些crash(崩溃),我也经常遇到。特此,我结合自己遇到的困扰与书中描述的问题,提出个人解决方案或者如何避免此类问题发生。 1、NullPointException(空指针异常) 原因是传入空指针,导致程序崩溃。下面介绍三种相关情况: (1)在对网络请求返回的结果进行处理时,如果直接解析返回空json,那么app就可

Web3.js介绍 · Ethereum Blockchain Developer Crash Course(三)了解交易transaction运作过程

本节教你如何创建交易transaction,会告诉你当交易创建时发生了什么,如何手动的把交易通过web3.js广播到网络上。 本节旨在帮助你理解以太坊区块链的交易时如何运作的,当你创建交易时,你在写数据到区块链并且更新区块链的状态,比如账户间发送以太币,调用合约中会写数据的方法,部署合约到区块链等都是交易。 为了把交易广播到网络上,我们要先对交易进行签名,我们使用 ethereumjs-tx

C++的异常捕获

目录 C语言的异常处理方式 C++的异常处理方式 异常的抛出与捕获 抛出与捕获原则 异常安全 C语言的异常处理方式 1、终止程序 常见形式:assert 缺陷:太过强硬,如果发生内存错误,或者除0语法错误等就会直接终止程序 2、返回错误码 缺陷:需要程序员自己去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误 C语言中基本都是使用