iOS的崩溃日志捕获,debugging信息..抓住并通过电子邮件发送到开发团队
最近,我们遇到了一个情况,我们想看到用户在他的设备上的应用程序的debugging信息。 所以,我正在寻找的是一种方法来查找设备上的日志,将其作为内嵌文本粘贴到邮件上,并允许用户发送它。
有任何想法吗? 下面是问题再次。1)find设备上的debugging日志2)打开文件,并将文件的内容作为内嵌文本附加到邮件。 3)允许用户在下次启动应用程序时通过电子邮件发送邮件。
谢谢,
感谢所有的投入家伙..我clubbed你的解决scheme到一个可以解决我的问题..这是我做的是..当然,我没有编译代码,这是一个半熟的代码..但我会当我在我的代码中执行它时,很快就会烙铁
NSLog进入文件如何NSLoglogin到文件 LOG2FILE
#if TARGET_IPHONE_SIMULATOR == 0 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); #endif
抓住崩溃并将它们logging到文件中
首先,创build一个函数来处理错误并将其输出到控制台(以及任何你想要做的事情):
void uncaughtExceptionHandler(NSException *exception) { NSLog(@"CRASH: %@", exception); NSLog(@"Stack Trace: %@", [exception callStackSymbols]); // Internal error reporting }
接下来,将exception处理程序添加到您的应用程序委托:
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions: (NSDictionary*)launchOptions { NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); // Normal launch stuff }
在info.plist中设置一个名为Crashed的variables,然后以这种方式读/写它
- (void)readPlist { NSString *localizedPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"]; NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:localizedPath]; NSString *crashed; crashed = [plistDict objectForKey:@"Crashed"]; } - (void)writeToPlist { NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; [plistDict setValue:@"YES" forKey:@"Crashed"]; [plistDict writeToFile:filePath atomically: YES]; }
一旦启动应用程序阅读info.plist并提示用户提交崩溃日志..
{ MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init]; mailComposer.mailComposeDelegate = self;[mailComposer setSubject:@"Crash Log"]; // Set up recipients NSArray *toRecipients = [NSArray arrayWithObject:@"first@example.com"]; [mailComposer setToRecipients:toRecipients]; // Attach the Crash Log.. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; NSData *myData = [NSData dataWithContentsOfFile:logPath]; [mailComposer addAttachmentData:myData mimeType:@"Text/XML" fileName:@"Console.log"]; // Fill out the email body text NSString *emailBody = @"Crash Log"; [mailComposer setMessageBody:emailBody isHTML:NO]; [self presentModalViewController:mailComposer animated:YES]; }
-
为了logging你自己的数据,使用Cocoalumberjack 。 它比NSLog快得多,可以dynamic打开/closures。 它还提供了将数据保存到文件中的选项。 NSLog将减慢您的应用程序并填写控制台日志。 一般来说,你也不想logging太多。 发生崩溃时,您无法安全地进行日志logging。 所以,一旦你找出问题所在,在那里添加一些日志logging,并尝试重现它,例如通过使用像KIF这样的自动化testing框架。
-
为了捕获崩溃报告,除了基于开源框架PLCrashReporter的解决scheme之外,您应该可以安全地捕获崩溃,当您的应用程序已经在应用程序商店时也是如此。 不build议使用别人build议的exception捕获,请查看本文以了解原因!
iTunes Connect也提供了查看一些崩溃报告的function,但最多需要2周的时间才能看到一些崩溃报告,但目前为止还没有像Camera +开发者指出的那样。 所以你最好使用你自己的解决scheme。
PLCrashReporter将向您发送标准的苹果格式的崩溃报告,准备好符号化,以便您知道代码中发生崩溃的位置,包括行号。
一些基于PLCrashReporter的解决scheme是:
- QuincyKit :开源客户端+ php服务器,基本的崩溃分组,符号化可以从你的mac自动化(我是这个开发者)
- HockeyApp :付费服务,使用QuincyKit客户端,先进的崩溃分组,在服务器上完全符号化(我是这个开发者的)
- Bugsense :免费服务,没有象征意义
- AppBlade :免费服务,如果使用25个或更less的设备,没有象征意义
- Crashlytics :私人testing版,未知function,他们的解决scheme似乎基于PLCrashReporter
-
所提出的解决scheme要么允许在下次启动时自动发送数据,要么通过询问用户是否同意发送。
对于Swift下的日志和分析,您可以使用SwiftyBeaver ,它是一个function齐全的日志平台,包括开源的Swift 2和Objective-C框架,encryption的云存储和Mac App。
网站: https : //swiftybeaver.com
框架(支持): https : //github.com/SwiftyBeaver/SwiftyBeaver
免责声明:我是一名创始人。
这是一个解决scheme,可以在发生崩溃时捕获崩溃,它将提供比崩溃日志更多的人类可读代码信息。 它会缺less一些崩溃日志,但是如Till所说,你应该可以访问那些。
从另一个关于Xcode 4.2的SO问题总是在崩溃后返回到main。 那里的答案使用这种方法,你可以扩展它来跟踪崩溃。
在AppDelegate中实现你自己的exception处理程序
// on load NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); void uncaughtExceptionHandler(NSException *exception) { NSLog(@"CRASH: %@", exception); NSLog(@"Stack Trace: %@", [exception callStackSymbols]); // Internal error reporting }
更新我做了一些回溯,这个解决scheme是由Zane克莱斯提供的问题Xcode 4.2debugging不象征性的堆栈调用
他在第二个评论中提供了一个通用的解决scheme “我认为将崩溃日志写入文件并提示用户在下次启动时提交它是有用的(仅在发布模式下,不妨碍debugging),这让我可以获得很好的bug报告。 ..用户知道他们的问题正在解决“我知道不是每个人都想问这个用户,但有超级用户在那里会很乐意帮助。
你当然可以包括再也不会给我这个提示button,这样人们就不会因报告机制而感到沮丧。
或者,您可以通过info(不知道它是否会崩溃,但保存它,偶尔尝试POST服务器的详细信息)
我一直在使用Crittercism为我自动化。 也用于testing和生产。
BugSense为iOS提供崩溃报告服务。 除了提供完全符号化的堆栈跟踪之外,BugSense还为所有应用程序中的崩溃提供分析。
我认为这比电子邮件好,因为当你的应用程序变得stream行时,你将需要手动pipe理所有这些电子邮件,而BugSense会自动执行此操作。 但是,BugSense也是开源的,因此您可以按照自己的需要修改其内部结构,并添加任何其他function。
除此之外,您可以让我们免费为您工作:如果您对我们希望拥有的一个很酷的新function有所了解,那么我们就会这样做 – 提供给我们也觉得它很酷。
免责声明:我为BugSense-iOS.framework编写代码。
如果您使用SDK的TestFlight,这是自动的。 这是一个非常好的系统。 但是,仅用于testing版本。
请参阅Ryan在如何从iphone .app文件中查看Apple提供的免费实用程序的NSLog语句的答案。
但这仍然不是一个方便的解决scheme。 如果你能买得起一个新的版本,你应该改变你的应用程序内的日志logging。 Jano在如何NSLog到一个文件有一些非常好的想法。 特别是选项2应该没有太多的努力。
一般来说,我会build议在项目开始的时候隐藏原生的日志logging工具或类似的devise,而不pipe使用什么编程语言。