iOS – 如何解码来自iTunes Connect的符号化崩溃报告?

我有一个新的应用程序,从应用程序商店被拒绝了这个消息:

We found that your app crashed on an iPhone 5 and iPad 3rd Gen running iOS 6.1, which is not in compliance with the App Store Review Guidelines. Your app crashed when we: 1) Launched the app This occurred when your app was used: - On Wi-Fi - On cellular network 

但我的应用程序的构build目标设置是设备:iPhone部署目标:6.0

我的plist设置是:目标设备系列:iPhone iOS部署目标:6.0

这里是我从苹果公司获得的崩溃日志:

 Incident Identifier: 9CA0955F-F59D-486C-8D73-8B3B61403EE4 CrashReporter Key: aca1b4fd3ac58a223f67f43ce5c768e6e94616f0 Hardware Model: xxx Process: Fundraising [13707] Path: /var/mobile/Applications/E4F866A6-D1B2-48F0-B471-913FAC78B0E3/Fundraising.app/Fundraising Identifier: Fundraising Version: ??? (???) Code Type: ARM (Native) Parent Process: launchd [1] Date/Time: 2013-02-02 10:13:13.282 -0800 OS Version: iOS 6.1 (10B141) Report Version: 104 Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Crashed Thread: 0 Last Exception Backtrace: (0x3445029e 0x3c2e997a 0x365e537c 0x3642758e 0x362b079c 0x36258c34 0x362586c8 0x36258116 0x37f4a59e 0x37f4a1ce 0x3442516e 0x34425112 0x34423f94 0x34396eb8 0x34396d44 0x362af480 0x362ac2fc 0x7a3aa 0x3c720b1c) Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libsystem_kernel.dylib 0x3c7e7350 __pthread_kill + 8 1 libsystem_c.dylib 0x3c75e11e pthread_kill + 54 2 libsystem_c.dylib 0x3c79a96e abort + 90 3 libc++abi.dylib 0x3bd38d4a abort_message + 70 4 libc++abi.dylib 0x3bd35ff4 default_terminate() + 20 5 libobjc.A.dylib 0x3c2e9a74 _objc_terminate() + 144 6 libc++abi.dylib 0x3bd36078 safe_handler_caller(void (*)()) + 76 7 libc++abi.dylib 0x3bd36110 std::terminate() + 16 8 libc++abi.dylib 0x3bd37594 __cxa_rethrow + 84 9 libobjc.A.dylib 0x3c2e99cc objc_exception_rethrow + 8 10 CoreFoundation 0x34396f1c CFRunLoopRunSpecific + 452 11 CoreFoundation 0x34396d44 CFRunLoopRunInMode + 100 12 UIKit 0x362af480 -[UIApplication _run] + 664 13 UIKit 0x362ac2fc UIApplicationMain + 1116 14 Fundraising 0x0007a3aa 0x79000 + 5034 15 libdyld.dylib 0x3c720b1c start + 0 Thread 1: 0 libsystem_kernel.dylib 0x3c7e7d98 __workq_kernreturn + 8 1 libsystem_c.dylib 0x3c735cf6 _pthread_workq_return + 14 2 libsystem_c.dylib 0x3c735a12 _pthread_wqthread + 362 3 libsystem_c.dylib 0x3c7358a0 start_wqthread + 4 Thread 2 name: Dispatch queue: com.apple.libdispatch-manager Thread 2: 0 libsystem_kernel.dylib 0x3c7d7648 kevent64 + 24 1 libdispatch.dylib 0x3c707974 _dispatch_mgr_invoke + 792 2 libdispatch.dylib 0x3c707654 _dispatch_mgr_thread$VARIANT$mp + 32 Thread 3: 0 libsystem_kernel.dylib 0x3c7e7d98 __workq_kernreturn + 8 1 libsystem_c.dylib 0x3c735cf6 _pthread_workq_return + 14 2 libsystem_c.dylib 0x3c735a12 _pthread_wqthread + 362 3 libsystem_c.dylib 0x3c7358a0 start_wqthread + 4 Thread 4: 0 libsystem_kernel.dylib 0x3c7e7d98 __workq_kernreturn + 8 1 libsystem_c.dylib 0x3c735cf6 _pthread_workq_return + 14 2 libsystem_c.dylib 0x3c735a12 _pthread_wqthread + 362 3 libsystem_c.dylib 0x3c7358a0 start_wqthread + 4 Thread 5 name: WebThread Thread 5: 0 libsystem_kernel.dylib 0x3c7d6eb4 mach_msg_trap + 20 1 libsystem_kernel.dylib 0x3c7d7048 mach_msg + 36 2 CoreFoundation 0x34425040 __CFRunLoopServiceMachPort + 124 3 CoreFoundation 0x34423d9e __CFRunLoopRun + 878 4 CoreFoundation 0x34396eb8 CFRunLoopRunSpecific + 352 5 CoreFoundation 0x34396d44 CFRunLoopRunInMode + 100 6 WebCore 0x3a37c500 RunWebThread(void*) + 440 7 libsystem_c.dylib 0x3c74030e _pthread_start + 306 8 libsystem_c.dylib 0x3c7401d4 thread_start + 4 Thread 0 crashed with ARM Thread State (32-bit): r0: 0x00000000 r1: 0x00000000 r2: 0x00000000 r3: 0x3e2db534 r4: 0x00000006 r5: 0x3e2dbb88 r6: 0x208694e4 r7: 0x2fd879f4 r8: 0x208694c0 r9: 0x00000300 r10: 0x366ce04b r11: 0x1fd56aa0 ip: 0x00000148 sp: 0x2fd879e8 lr: 0x3c75e123 pc: 0x3c7e7350 cpsr: 0x00000010 

我正在学习这两个页面的符号化:1) http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs 2) 符号化的iPhone应用程序崩溃报告

我对以下几件事情感到困惑:当我将应用程序上传到iTunes时,确实有旧的存档。 但他们希望我有一个.app文件。 那是哪个文件? 这是档案吗? 哪个文件是myApp.app.dSYM文件? 我只是将整个崩溃报告复制到一个文本文件,并保存在本地?

谢谢!

另外,这是应用程序启动时运行的一些代码:

 - (void)viewDidLoad:(BOOL)animated { UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"building"]]; [self.view addSubview:imgView]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"building"]]; imgView.frame = self.view.bounds; // to set the frame to your view's size [self.view addSubview:imgView]; [self.view sendSubviewToBack:imgView]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { //load iphone image UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"building"]]; imgView.frame = self.view.frame; [self.view addSubview:imgView]; [self.view sendSubviewToBack:imgView]; } else { //load ipad image UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"building@2x"]]; imgView.frame = self.view.bounds; // to set the frame to your view's size //[self.view addSubview:imgView]; imgView.frame = self.view.frame; [self.view sendSubviewToBack:imgView]; } // Get user data. NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; // First arg is name and second is if not found. NSString *user_id = [standardUserDefaults objectForKey:@"user_id"]; NSString *user_email = [standardUserDefaults objectForKey:@"email"]; BOOL first_time_cookie = [standardUserDefaults boolForKey:@"first_time_cookie"]; [super viewDidAppear:animated]; if(!first_time_cookie) { // First time on the app, so set the user cookie. [standardUserDefaults setBool:YES forKey:@"first_time_cookie"]; EmailUtil *email_new_user = [[EmailUtil alloc] initWithSubject:@"New_Download" body:@"New_iPhone_download"]; [email_new_user send]; // Send to server to make new acount AND send me an email re - new user. [self sendFeedback]; [standardUserDefaults synchronize]; } else { EmailUtil *email = [[EmailUtil alloc] initWithSubject:@"RepeatUser" body:[NSString stringWithFormat: @"User_id: %@, and email: %@" , user_id , user_email]]; [email send]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void) sendFeedback { NSString *string_url = @"http://www.my_url.php"; NSURL *url = [NSURL URLWithString:string_url]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url ]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ( error != nil ) { // Send me an email that there was an error EmailUtil *email = [[EmailUtil alloc] initWithSubject:@"iCreate_User_Error" body:@"There_was_some_error_creating_user_INVESTIGATE"]; [email send]; } else if ( data != nil ) { NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; if ([responseString rangeOfCharacterFromSet:notDigits].location == NSNotFound) { // newString consists only of the digits 0 through 9 NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; [standardUserDefaults setObject:responseString forKey:@"user_id"]; [standardUserDefaults synchronize]; } } }]; } 

首先,您需要存储和保存.dSYM文件,以便为要为其生成符号的构build版本。

  1. 从这个位置复制symboliccracked可执行文件到桌面上的某个文件夹以方便访问:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

  1. 将崩溃和.dSYM文件复制到相同的文件夹。

  2. 从terminal导航到该文件夹​​并运行下面给出的命令:

./symbolicatecrash .crash .app.dSYM

**符号性IPA **

如果我们使用IPA进行符号化 – 只需使用.zip重命名扩展名为.ipa的文件,将其解压缩即可获得包含应用程序的Payload文件夹。 在这种情况下,我们不需要.dSYM文件。 (仅当在复制期间没有被剥离的debugging符号的情况下)

参考: Symbolicating iPhone应用程序崩溃报告

你有提交给苹果的IPA或档案,你可以看到主办单位 – >档案。 如果您右键单击并select显示包内容,则会出现一个名为dSYM的文件夹,您可以在其中find提交的应用程序的dSYM文件。

在这里输入图像说明在这里输入图像说明在这里输入图像说明

iPhone应用程序可以在iPad上运行。 他们在屏幕上运行一个“窗口”,其大小和形状与iPhone屏幕相同。

话虽如此,你的应用程序也崩溃在iPhone 5上。所以它不是专门在iPad上运行。 您需要查看崩溃日志以获取详细信息。

你错了目标iPhone不是在iPad上运行的东西。 但不仅仅是iPad适当的用户界面,全屏幕。 根据我的经验,苹果testing最新的操作系统,设备。 那么,iPad 3在testing中。 我iPhone提交给苹果。 但iPad也经过testing。

一个目标是不一样的,你可以让它运行…目标只是告诉xCode你要testing它,它不告诉xCode,你只希望它能够运行在设备…因此,您需要在plist file查看(google)设置requirementsDevice Capabilities ! 祝你好运! 🙂

其他人已经提到了这样一个显而易见的事实,即你的构build也可以在iPad上运行,尽pipe在一个较小的窗口中。 所以让我们继续分析你的崩溃日志。

 Exception Type: EXC_CRASH (SIGABRT) 

这意味着一个消息被发送到一个对象,没有回应。 (未知的select器崩溃)

 Thread 0: 14 Fundraising 0x0007a3aa 0x79000 + 5034 

我假设Fundraising是你的申请的名称。 看,这里的这一行会给你上次执行的方法名称(在0x0007a3aa中表示)。 前提是你有上传到app store的版本的.dSYM文件。

.dSYM文件是在您存档应用程序时生成的文件。 .sym文件生成位置

所以我说你得到这个文件,检查它出错的方法:)。

要了解更多信息,请访问此页面: http : //www.raywenderlich.com/23704/demystifying-ios-application-crash-logs