iOS - How can I decode the symbolicated crash repo

2019-02-09 12:02发布

问题:

I have a new app, which was rejected from the app store with this message:

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

But my build target settings for the app were Devices: iPhone Deployment target: 6.0

And my plist settings are: Target device family: iPhone iOS deployment target: 6.0

Here are the crash logs I got from Apple:

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

I am learning about symbolication from these two pages: 1) http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs 2) Symbolicating iPhone App Crash Reports

I am confused with a few things: I do have the old archive which was made when I uploaded the app to iTunes. But they want me to have a .app file. Which file is that? Is that the archive? And which file is the myApp.app.dSYM file? And do I just copy the entire crash report into a text file and save that locally?

Thank you!

Also, this is some of the code that runs when the app starts:

- (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];
                 } 
             }
     }];    
}

回答1:

First of all you need to store and save .dSYM file for the build you want to symbolicate issue for.

  1. copy symbolicatecrash executable from this location to some folder on desktop for easy access:

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

  1. copy the crash and .dSYM file to the same folder.

  2. Navigate from terminal to that folder and run the command given below:

./symbolicatecrash .crash .app.dSYM

** Symbolicating IPA **

if we use IPA for symbolicating - just rename the extention .ipa with .zip , extract it then we can get a Payload Folder which contain app. In this case we don't need .dSYM file. (only in case when debug symbols where not stripped during copy)

Ref: Symbolicating iPhone App Crash Reports

Do you have the ipa that was submitted to Apple or the archive which you can see under Organizer->Archives. If you right-click and select show package contents then there will be a folder named dSYM under that you can find the dSYM file for your submitted app.



回答2:

iPhone applications can be run on iPads. They run in a "window" on screen, the same size and shape as an iPhone screen.

That being said, your application ALSO crashed on an iPhone 5. So it's not specific to running on an iPad. You'll need to look at the crash logs for details.



回答3:

You're mistaken Targets iPhone is not a thing that can not run on the iPad. But not just for the iPad Appropriate UI, Full Screen. In my experience, Apple test the latest OS, Device. So, iPad 3 in the test. I iPhone submitted for Apple. but iPad also have tested.



回答4:

A target is not the same as what you are allowing it to run on... The target simply tells xCode what you are about to test it on, it doesn't tell xCode that you want it to only be able to run on that device... for that you need to look into (google) setting requirements and Device Capabilities in your plist file! Good luck! :)



回答5:

Everyone else has already mentioned the obvious that that your build will also run in iPad, though in a smaller window. so lets go to the next step of analyzing your crash log.

Exception Type:  EXC_CRASH (SIGABRT)

this means a message was sent to an object, that didn't respond to it. (unknown selector crash)

Thread 0:
14  Fundraising                     0x0007a3aa 0x79000 + 5034

I am assuming Fundraising is the name of your application. See, this line here will give you name of the method (symbolified inside 0x0007a3aa) which was last executed. provided you have the .dSYM file of the build that you uploaded to app store.

.dSYM file is the one that is generated when u archive your app.

So i say you get that file, check for the method where it went wrong and :).

To know more go to this page: http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs