美文网首页
[iOS]转发异常信号

[iOS]转发异常信号

作者: 汴城码农 | 来源:发表于2020-11-14 11:37 被阅读0次

背景:项目中有个SDK库(Golang),会抛出异常信号,第三方crash日志记录工具会分析这个信号而造成崩溃,我们做作的就是在三方注册异常监听后,重新注册,覆盖监听,达到避免crash的目的。

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface TestCrash : NSObject

+(void)registerExceptionHandler;
@end

NS_ASSUME_NONNULL_END

#import "TestCrash.h"
#include <execinfo.h>

@implementation TestCrash

+(void)registerExceptionHandler
{
    signal(SIGABRT, SignalHandler);
    signal(SIGILL, SignalHandler);
    signal(SIGFPE, SignalHandler);
    signal(SIGBUS, SignalHandler);
    signal(SIGTRAP, SignalHandler);
    signal(SIGPIPE, SignalHandler);
    signal(SIGSEGV, SignalHandler);
}

void SignalHandler(int signalCode)
{

    const NSInteger kCSIIStackFramesMax = 128;
    void *stack[kCSIIStackFramesMax];
    NSInteger frameCount = backtrace(stack, kCSIIStackFramesMax);
    char **lines = backtrace_symbols(stack, (int)frameCount);

    NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frameCount];
    for (NSInteger i = 1; i < frameCount; i++)
        [backtrace addObject:[NSString stringWithUTF8String:lines[i]]];

    free(lines);

    NSDictionary *userInfo = @{@"signal_code": @(signalCode), @"kCSIIExceptionUserInfoBacktraceKey": backtrace};
    NSString *reason = [NSString stringWithFormat:@"App terminated by SIG%@", [NSString stringWithUTF8String:sys_signame[signalCode]].uppercaseString];
    NSException *e = [NSException exceptionWithName:@"Fatal Signal" reason:reason userInfo:userInfo];

    
    NSLog(@"=======>%@",userInfo);
    sleep(2.0);
}
@end

最好能用signal(SIGBUS, SIG_IGN);这种形式,让系统忽略处理

相关文章

网友评论

      本文标题:[iOS]转发异常信号

      本文链接:https://www.haomeiwen.com/subject/ycoibktx.html