views:

516

answers:

1

My app some times crashes at start-up. In stack-trace only messages from built-in frameworks. An excerpt from a crash log:

OS Version:      iPhone OS 3.1.3 (7E18)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x000e6000
Crashed Thread:  0

Thread 0 Crashed:
0   CoreGraphics                       0x339305d8 argb32_image_mark_RGB32 + 704
1   CoreGraphics                       0x338dbcd4 argb32_image + 1640
2   libRIP.A.dylib                     0x320d99f0 ripl_Mark
3   libRIP.A.dylib                     0x320db3ac ripl_BltImage
4   libRIP.A.dylib                     0x320cc2a0 ripc_RenderImage
5   libRIP.A.dylib                     0x320d5238 ripc_DrawImage
6   CoreGraphics                       0x338d7da4 CGContextDelegateDrawImage + 80
7   CoreGraphics                       0x338d7d14 CGContextDrawImage + 364
8   UIKit                              0x324ee68c compositeCGImageRefInRect
9   UIKit                              0x324ee564 -[UIImage(UIImageDeprecated) compositeToRect:fromRect:operation:fraction:]
10  UIKit                              0x32556f44 -[UINavigationBar drawBackButtonBackgroundInRect:withStyle:pressed:]
11  UIKit                              0x32556b00 -[UINavigationItemButtonView drawRect:]
12  UIKit                              0x324ecbc4 -[UIView(CALayerDelegate) drawLayer:inContext:]
13  QuartzCore                         0x311cacfc -[CALayer drawInContext:]
14  QuartzCore                         0x311cab00 backing_callback
15  QuartzCore                         0x311ca388 CABackingStoreUpdate
16  QuartzCore                         0x311c978c -[CALayer _display]
17  QuartzCore                         0x311c941c -[CALayer display]
18  QuartzCore                         0x311c9368 CALayerDisplayIfNeeded
19  QuartzCore                         0x311c8848 CA::Context::commit_transaction(CA::Transaction*)
20  QuartzCore                         0x311c846c CA::Transaction::commit()
21  QuartzCore                         0x311c8318 +[CATransaction flush]
22  UIKit                              0x324f5e94 -[UIApplication _reportAppLaunchFinished]
23  UIKit                              0x324a7a80 -[UIApplication _runWithURL:sourceBundleID:]
24  UIKit                              0x324f8df8 -[UIApplication handleEvent:withNewEvent:]
25  UIKit                              0x324f8634 -[UIApplication sendEvent:]
26  UIKit                              0x324f808c _UIApplicationHandleEvent
27  GraphicsServices                   0x335067dc PurpleEventCallback
28  CoreFoundation                     0x323f5524 CFRunLoopRunSpecific
29  CoreFoundation                     0x323f4c18 CFRunLoopRunInMode
30  UIKit                              0x324a6c00 -[UIApplication _run]
31  UIKit                              0x324a5228 UIApplicationMain
32  Journaler                          0x000029ac main (main.m:14)
33  Journaler                          0x00002948 start + 44

File main.m is simple as possible:

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil); // line 14
    [pool release];
    return retVal;
}

What my cause the app to crash?

JournalerAppDelegate.h:

// ...

@interface JournalerAppDelegate : NSObject <UIApplicationDelegate> {
    // ...
    UINavigationController *navigationController;
    AccountsViewController *rootViewController;
    // ...
}

JournalerAppDelegate.m:

// ...

@implementation JournalerAppDelegate
// ...
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // ...
    rootViewController = [[AccountsViewController alloc] initWithNibName:@"AccountsViewController" bundle:nil];
    navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

    NSString *accountKey = // ...;
    if (accountKey) {
        LJAccount *account = // ...;
        if (account) {
            [rootViewController view]; // forces to load view
            [rootViewController openAccount:account animated:NO];
        }
    }

    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];
}
// ...

AccountsViewController.h:

// ...

@interface AccountsViewController : UIViewController</* ... */> {
    // ...
    NSMutableDictionary *cacheTabBarControllers;
    // ...
}

AccountsViewController.m:

// ...

@implementation AccountsViewController
// ...
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    if (self = [super initWithNibName:nibName bundle:nibBundle]) {
        cacheTabBarControllers = [[NSMutableDictionary alloc] initWithCapacity:1];
    }
    return self;
}
// ...
- (void)openAccount:(LJAccount *)account animated:(BOOL)animated {
    AccountTabBarController *tabBarController = [[cacheTabBarControllers objectForKey:account.title] retain];
    if (!tabBarController) {
        tabBarController = [[AccountTabBarController alloc] initWithAccount:account];
        [cacheTabBarControllers setObject:tabBarController forKey:account.title];
    }

    [self.navigationController pushViewController:tabBarController animated:animated];
    [tabBarController release];
}
// ...
A: 

Looks like its crashing while trying to draw the UINavagationBar's back button. Is there any reason your app would have a back button when it starts?

Are you restoring the navigation stack from a previous run? Are you creating a navigation stack with more than just a root view controller.

Is your memory management correct in the all required places?

Jasarien
Yes, my app may try to restore previous UI state on start-up. State is restored in [JournalerAppDelegate applicationDidFinishLaunching:].
Aleksejs
I have added to my question some parts of code.
Aleksejs
Does this crash occur consistently or sporadically?
Jasarien
Only sometimes, thus I don't have any idea how to reproduce it.
Aleksejs
Do you see it on the device, simulator or both?
Jasarien
This crash log is from iTunes Connect.
Aleksejs
Very interesting. Personally, I'd raise this with Apple, and see what they have to say about it. http://bugreport.apple.com I've seen some strange crashes come out of iTunes connect that form a very low percentage of overall issues. I would probably chalk them down to people with jailbroken phones that have tinkered with custom frameworks and enabling things that could interfere etc...
Jasarien
I have reported to Apple.
Aleksejs
It'll be interesting to know if its a bug in the OS or not. Update the question if they respond :)
Jasarien
Issue after some investigation was closed due "Insufficient information".
Aleksejs