• Hjay
    2019-04-11
    文中所讲的crash捕获只说了针对信号的,基本都是需要内核操作的一些才会以信号的形式给到进程,而oc自己也有定义一些并没深入到内核的一些exception,这些是通过注册exceptionhandle来进行捕获的,所以crash的收集应该是分两块,只说信号这一种是不够完整的

    作者回复: 你说的没错,现在收集 crash 的框架都是用的Mach异常+Unix信号方式这样的方式。

     2
     9
  • WeZZard
    2019-04-06
    爆棧也可以引起崩潰。看了很多 iOS 面試的鏈表題答案都是單純用的自動引用計數管理後繼節點,這種做法下鏈表長到數萬後一析構就會崩,原因就是自動引用計數引起的鏈錶各節點鏈式析構所導致的爆棧。
    
     8
  • yehot
    2019-04-08
    使用 registerSignalHandler 和handleSignalHandler 是能够捕获到异常。
    但是,这个时候 app 已经立即要 crash 了。捕获的异常怎么才能确保能够持久化到沙盒呢?写入文件的代码是没法保证在 crash 前正常执行完的吧!
    
     6
  • Null
    2019-05-09
    老师,我是做SDK,要如何从捕获的日志中区分出来哪些是我的SDK的,哪些是主端APP的,哪些是其他Framwork。目前了解的,动态库收集的日志会有库信息,静态库收集到的信息都是APP的名字。。拜求老师指导下。
    
     5
  • 周小鱼
    2019-04-25
    有个小小的建议,希望戴老师以后贴出的代码片段写一下来源或者源码链接,这样方便查看的时候快速翻阅上下文。

    作者回复: 很好的建议

    
     5
  • Adam
    2019-04-06
    @Mhy
    1. ‘If your app targets iOS 9.0 and later or OS X v10.11 and later, you don't need to unregister an observer in its deallocation method。’ 在9.0之前需要手动remove 观察者,如果没有移除会出现观察者崩溃情况。
    2. NSNotification 有同步、异步、聚合发送等线程问题,不同的线程处理不好就可能出现崩溃,情况比较多可以参考一些资料。
    
     5
  • Mhy
    2019-04-06
    请问关于NSNotification线程问题能大致的讲一下吗
     1
     4
  • 一纸丶荒年
    2019-08-28
    老师 您好 , 我 想知道的是 你讲这一篇文章 没有确切的解决问题吖, 我想了解的是 怎么来解读那些 堆栈信息. 那些崩溃日志, 都看不懂的.
    
     3
  • 鼠辈
    2019-05-14
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^( void) {
            [self yourTask];
        }];
    }
    这个代码中的yourTask,是后台申请3分钟之后,才会调用的吧,这个时候如果没有执行完,我试了不会崩溃。求解释
    展开
    
     3
  • Hiuzi
    2019-04-11
    戴老师,有没有办法在一个项目了集成某个第三方sdk的两个版本?最近被admob sdk坑惨了,一个月发了4个版本都是修复bug的,我想更新下如果有闪退只能回退老版本了,回退老版本只能发版解决了,有没有不发版的方案解决这个问题呢?

    作者回复: 没法集成两个版本,符号肯定冲突

    
     3
  • will
    2019-09-09
    老师,我这个对吗,我看了,系统刚好在快3分钟到时候执行打印线程堆栈信息
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        UIApplication *app = [UIApplication sharedApplication];
        __block UIBackgroundTaskIdentifier bgTask = 0;
        
        NSLog(@">>>>>>>>");
        
        
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"<<<<<<");
            NSLog(@"线程堆栈信息:%@",[NSThread callStackSymbols]);
            if (bgTask != UIBackgroundTaskInvalid) {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
            
        }];
    }
    展开
    
     2
  • 周小明
    2019-05-21
    打印到了 1000+ 超过了10 分钟都没有 kill。请问是怎么回事呢?

    ```` objc
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        [application beginBackgroundTaskWithExpirationHandler:^{
            __block int i = 1;
            dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
            dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
            dispatch_source_set_event_handler(timer, ^{
                NSLog(@"%d",i);
                i++;
                if (i > 60*100 + 5) {
                    dispatch_source_cancel(timer);
                }
                
            });
            dispatch_resume(timer);
            
        }];
    }

    ````
    展开
     2
     2
  • ssala
    2019-04-12
    我们采用的fabric监控APP crash问题,但是有些crash的堆栈完全看不出头绪,千奇百怪。
    
     2
  • 青冈
    2019-04-12
    戴老师,bugly针对应用进入后台被系统强杀也算是一种crash。您告诉我是后台工作超时,那这种情况的话我是应该在DidEnterBackground这种函数中做什么处理;还是在bugly中做什么配置,不捕捉把这种情况下的crash呢? app进入后台之后,bugly抓捕crash的名称是 SEGV 是 segmentation violation 的缩写,是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。这种的话,我应该

    作者回复: 在DidEnterBackground里尽快完成,不要超时了。

     1
     1
  • CoderJJMa
    2019-04-08
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeater) userInfo:nil repeats:YES];
        return YES;
    }

    -(void)repeater{
        
        NSLog(@"%s",__func__);
        
    }

    - (void)applicationDidEnterBackground:(UIApplication *)application {
        
        NSLog(@"===== : applicationDidEnterBackground");
        NSLog(@"begin=============");

      self.bgIdentify = [application beginBackgroundTaskWithExpirationHandler:^{
            [self endBack];
        }];
    }

    -(void)endBack{
        
        NSLog(@"end=============");
        NSLog(@"callStackSymbols : %@",[NSThread callStackSymbols]);

        [[UIApplication sharedApplication] endBackgroundTask:self.bgIdentify];
        self.bgIdentify = UIBackgroundTaskInvalid;
    }
    展开
    
     1
  • 小敏
    2020-01-11
    老师,Pl和友盟冲突怎么解决?
    
    
  • 普通拳
    2019-12-09
    戴老师讲解很透彻。不过我有一个疑问,很多公司的iOS开发人员有限,大部分情况下没有太多人力物力去做一些很底层的事情,比如收集崩溃日志等。您之前在滴滴的时候,这些崩溃日志的收集、性能监控等等,都是自己团队开发的吗?你们整个iOS技术团队包括业务组在内,一共大概有多少人啊?希望老师能解答我的疑惑~
    
    
  • iOS小菜鸟
    2019-10-21
    漏讲了一个重要的Mach异常,不补上吗
    
    
  • 西京富贵兔
    2019-07-22
    戴老师,关于 SIGTRAP 这种问题怎么分析好呢?
    
    
  • tomcat
    2019-07-01
    进入后台之后能在非主线程打印日志吗?主线程打印日志的话可能会造成干扰。
    
    
我们在线,来聊聊吧