前言
这个月刚接手了一个新项目, 期初没怎么在意,后来在开发过程中慢慢发现了一些问题,其中就包括无法控制台不打印崩溃信息,这实在是有点蛋疼,给排查问题无疑添加了负担,只能查找哪里的问题了,找了几次一直没能解决,直到今天。
网上解决办法
没有设置 NSSetUncaughtExceptionHandler 这个崩溃日志方法于是乎在appDelegate.m添加如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
return YES;
}
void uncaughtExceptionHandler(NSException*exception) {
// NSLog(@"CRASH: %@", exception);
// NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
NSArray *stackArry= [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSString *exceptionInfo = [NSString stringWithFormat:@"Exception name:%@\nException reason:%@\nException stack :%@",name,reason,stackArry];
NSLog(@"%@",exceptionInfo);
// Internal error reporting
}
然并卵,丝毫没有改变什么!!
问题原因
继续寻找原因, 文章还有引用了AvosCloud的后台SDK, 它默认开启了将崩溃日志上传的功能, 但是他没有打印本地的崩溃日志, 最后一段代码解决了这个问题.这是其他人遇到的问题:
[AVAnalytics setCrashReportEnabled:NO];
还有比如友盟分析
[MobClick setCrashReportEnabled:NO];
- 真实的原因
网上的文章给了我一些启发,大概就是第三方类库的原因,看了看发现项目中集成的 腾讯分析,
/**
是否启用崩溃报告,需要在 MTA 启动函数之前调用。默认启动
*/
@property (nonatomic, assign) BOOL enableCrashReport;
果断设置为 NO:
[MTACrashReporter sharedInstance].enableCrashReport = NO;
OK , 问题解决了,
另外友盟的也有:
/** 开启CrashReport收集, 默认YES(开启状态).
@param value 设置为NO,可关闭友盟CrashReport收集功能.
@return void.
*/
+ (void)setCrashReportEnabled:(BOOL)value;
[MobClick setCrashReportEnabled:NO];
但单对我这个项目来说,其实没有影响,特意测试了一下,设不设置无影响。
小结
Xcode不输出Crash日志可能的原因:
- NSSetUncaughtExceptionHandler() 可能被重写了, 你调用之前它之后,(比如你引用了一些第三方库, 它的SDK里面可能包含了把Crash的日志上传到服务器, 这样这个日志可能被重写了, 就不打印本地的崩溃信息了) 尽量把它放在didFinishLaunchingWithOptions 最后面的一行代码块里.
但是不一定管用,就像开始的试了无效果。
- 还一种崩溃的情况是 EXC_BAD_ACCESS 当遇到这种错误, 控制一般不会给你很多关于崩溃的信息, 这种崩溃你只能使用下面这个调试方法, 不过记住你在正式发布的时候记得把这个勾取消, 不然会造成一些严重的问题.
因为选择了zombie以后所有oc对象都不会呗释放.
image这个很少会这样吧!!!
其实大部分的原因都是因为引用的一些第三方库, 它的SDK里面可能包含了把Crash的日志上传到服务器的原因,一个一个找找看应该就可以解决。
网友评论