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

相关文章

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

如何使用Selenium捕获控制台日志

Selenium是一个流行的开源工具,用于自动化Web浏览器。其中一个关键功能是能够与浏览器的开发者控制台交互。本文将向您展示如何在Selenium中使用Java获取控制台日志。这些日志对于调试和解决Selenium脚本的问题非常有用。 如何查看任何网页的控制台日志 首先,打开浏览器的开发者控制台。在大多数浏览器中,您可以通过右键点击页面并选择“检查”来做到这一点。我们将在我们的测试网站——h

八、我们应当怎样做需求调研:需求捕获(下)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

七、我们应当怎样做需求调研:需求捕获(上)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

block对变量捕获的方式

之前见很多文章对block捕获变量的方法,会进行诸如此类的描述:“block会捕获被引用的变量, 并对其进行copy操作, 因此, 可能会导致其引用计数加1,如果处理不好, 可能因循环引用导致内存泄漏。” 实际上, 这种说法并不严谨。block对变量的捕获, 根据变量类型的不同,会采用不同的捕获方式。 (1)静态或者全局变量, 在block中直接是指针传递的方式传入block中,对其进行的操作

异常捕获及处理

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">为什么要使用异常处理?</span> 程序一旦出现异常后,则在异常语句之后的代码将不再执行,而是直接退出程序。 为了保证程序中即使出现了异常之后,仍然可以继续执行的话,那么就需要使用异常处理语句了。

mac捕获android任意应用的view视图

一、uiautomatorviewer 介绍    iautomatorviewer是android SDK自带的一个元素定位工具。通过截屏并分析XML布局文件的方式,为用户提供控件信息查看服务。 使用uiautomatorviewer,你可以检查一个应用的UI来查看应用的布局和组件以及相关的属性。该工具位于SDK目录下的tools\bin子目录下。 二、效果图 下图演示 截取微信的 v

JAX-WS - Soap消息的捕获

一、TcpMon捕获     1、下载apache-tcpmon-1.0,并运行build目录下的tcpmon-1.0.jar启动。     2、配置TcpMon,如下图              3、改写JAX-WS - 基础示例中的WSClient,并执行

java 注意线程下的 异常捕获,会跳过sleep(10000)休眠,可能会出现死循环

线程 (1)在catch(){} 中的语句要保证不会出现异常,或者catch中的语句再次捕获了异常,    (2) 线程中try中的语句出现异常,会直接跳过try中的sleep,导致不停地循环   (3)线程的while循环中如果不适用try catch 会导致当出现异常时,线程直接挂掉, package com.hlzt.wx.thread;import java.util.Date

【C++】try 语句捕获异常,catch子句处理异常

#include <iostream>#include <stdexcept>using namespace std;int main(){int i1, i2;while(cin >> i1 >> i2){try{if (i2 == 0)throw runtime_error("分母为0!");cout << "i1除以i2的结果是: " << i1/i2 << endl;}catch(ru