I have a very peculiar issue.
Recently I added 64bit support to my iOS project (arm64), ever since doing that I started receiving uncaught exceptions for segments of my code inside #try...#catch (I'm using Crashlytics for crash reporting). I managed to reproduce the problem with the following lines of code anywhere in my app (I wrote them inside init of one of my view controllers):
#try {
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
NSString *s;
m[s] = #"poop";
} #catch (NSException *e) {
NSLog(#"POOP");
}
The exception gets caught by the UncaughtExceptionHandler instead of the #catch clause. I'm confused as to what can cause this. The output in the console:
2015-02-22 19:19:53.525 [391:30650] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
*** First throw call stack:
(0x18823a59c 0x1989400e4 0x1881251f8 0x10011e2f4 0x10011e068 0x10010e480 0x10010db78 0x10010d944 0x1000a8050 0x100075d88 0x100075160 0x100142044 0x100141f6c 0x18c9ecaa0 0x18caa1fb4 0x18caa1eb0 0x18caa134c 0x18caa0ff8 0x18caa0d18 0x18caa0c98 0x18c9e9648 0x18c341994 0x18c33c564 0x18c33c408 0x18c33bc08 0x18c33b98c 0x18cc76dbc 0x18cc77c68 0x18cc75dec 0x1904b162c 0x1881f2a28 0x1881f1b30 0x1881efd30 0x18811d0a4 0x18ca573c8 0x18ca523c0 0x1000747d8 0x198faea08)
libc++abi.dylib: terminating with uncaught exception of type NSException
I tried removing the custom exception handler that I have and disabling Crashlytics, still no success.
As soon as I remove arm64 from ARCHS and VALID_ARCHS the code works and the exception is caught as expected.
Any information will be appreciated!
Small update - our XCTests also started not to catch exceptions, up until now the behaviour only happened on physical 64bit phones.
After a long session of git-bisecting the culprit was the following linker flag
-no_compact_unwind
I Used BlocksKit v2.2.0 which still had that flag even though it stopped using libffi (latest version of BlocksKit removed that unneeded flag). As soon as I removed that linker flag 64bit #try...#catch blocks started to work again.
I still don't have complete understanding of why this behaviour happens but I'm going to dig a bit more and update this thread if I find anything interesting.
phew
On iOS and Objective-C Exceptions are only to be used for un-recoverable programming errors, not for program execution control.
In particular they do not handle catches accross stack frames inthe APIs.
Related
I can't get my app to run now on certain devices.
int retVal = UIApplicationMain(argc, argv, nil, #"AppController"); <---SIGABRT
In the console I get...
-[BAPushCenter (null selector)]: unrecognized selector sent to instance 0x8a22960
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[BAPushCenter (null selector)]: unrecognized selector sent to instance 0x8a22960'
*** First throw call stack:
(0x2502386b 0x369d6dff 0x25029035 0x369f1a4b 0x25028244 0x24f528e5 0x24f56377
0x1cfa1 0x25026b31 0x24f562b8 0x291baa29 0x293cd61d 0x293e0381 0x293ca91f
0x2d18dccd 0x2d18dfb90x24fe6827 0x24fe6417 0x24fe477f 0x24f371e9 0x24f36fdd
0x291a143f 0x2919c18d 0x2a70d3 0x37101873)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
I have no idea what BAPushCenter is, I did a project search and can't find it anywhere. I used an exception breakpoint but it didn't show me any more information then original error.
Update: After testing more devices the error only seems to occur on iOS 9 devices. But iOS 9 simulator devices and any other device below iOS 9 work fine. Any ideas?
In my case, because of the "Batch Framework" my app crashes
Figured it out. The class was coming from one of my static libs so i wasn't able to search it. When I figured out what lib was causing the issues I completely removed it from my app and it compiled fine. Once I get an updated version of that lib I'll put it back in my app, thanks.
I ran into a problem which I seem to can't fix.
Whenever I try to run my app (XCode 7 BETA 2) on my device (iOS 9 BETA 2) it crashes at AppDelegate with the following error:
2015-06-24 04:12:46.769 eSports Center 2[1472:96321] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(0x18433738c 0x1989dbf2c 0x184224da8 0x184224c40 0x100204efc 0x10020508c 0x1001fc968 0x1002027c8 0x18422d360 0x18422d1d0 0x100201f74 0x1001fc3f8 0x1898be414 0x1890f23c0 0x1890ed008 0x1898d48c4 0x1002281bc 0x1898be414 0x1890f23c0 0x1890ed008 0x1898d48c4 0x189981188 0x18997ec00 0x189997048 0x189996d58 0x189996a60 0x1898fc19c 0x1898fa518 0x18998a974 0x1899808c0 0x18997fa90 0x18997f6b8 0x18997f620 0x1898be414 0x1890f23c0 0x1890ed008 0x1890ecec8 0x1890ec594 0x1890ec2e8 0x1890e5ab8 0x1842ee39c 0x1842ec114 0x1842190f0 0x18992f838 0x18992a5f0 0x1001192ac 0x19921a8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException
When I try to run it on the Simulator everything is fine. The App itself is a recode of my current project in Swift 2.0 with some pods (for the first time).
It includes 3 libs and some basic UI stuff, I tried to setup the first TabController tab.
Someone has an idea of how to fix them?
Everything Is working now. One library I'm using, tried to load a Font which wasn't available on my iPhone but on my Simulator (?).
Thanks for all the help, Breakpoint and stepping through the Library code did the trick!
I have implemented AWS - Simple Notification Service and it was working fine, but after I upgraded my iOS 7 to iOS 8 application is crashed with :
*** Terminating app due to uncaught exception 'AmazonClientException', reason: ''
* First throw call stack:
(0x186f3e084 0x19751c0e4 0x100270224 0x10026f95c 0x1000dd7f0 0x187e0a60c 0x197d3fe80 0x197d3fddc 0x197d3cfb0)
libc++abi.dylib: terminating with uncaught exception of type SNSInvalidParameterException
After execution of below code snippet its crashing,
endPoint.platformApplicationArn = #"arn:aws:sns:eu-west-1:ID:app/APNS_SANDBOX/AppName_Dev";
[amazonClient createPlatformEndpoint:endPoint];
Thank you in advance.
Finally, I've got an solution, this is due to not using same user data for endPoint.customUserData. As Yosuke commented [AmazonLogger verboseLogging]; helped me a lot in tracking the bug.
So try to use same data (as in here #"Test") for one application.
endPoint.customUserData = #"Test";
I have run into a disturbing/baffling bug. Core Data seemed to be swallowing its own exception! When using the (super-useful) CoreDataHelper, I had written a badly formed fetch that resulted in a "Unimplemented SQL generation for predicate" exception. That part's simple, what's really weird is that this exception was being caught somewhere and swallowed, meaning that my code just skipped the rest of the method after that fetch and returned to the main loop without any console messages. Quite infuriating.
Eventually I was able to wrap the actual fetch request in a #try statement and #catch the exception:
#try{
fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
NSLog(#"fetch successful");
}
#catch (NSException* exception) {
NSLog(#"caught exception!\n\n%#\n\n%#\n\n%#",[exception name], [exception reason], [exception userInfo]);
}
This let me figure out what it was, but it still makes no sense that it would be getting caught somewhere. I have not used #try/#catch anywhere else in my code other than to test this.
I also tried creating a blank Core Data project and using CoreDataHelper without the #try/#catch statement to try and isolate the problem, with nothing else in the project, CoreDataHelper works as it should, returning:
CoreDataTest[1044:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unimplemented SQL generation for predicate ("test" LIKE attribute)'
So something in my project is catching and ignoring this exception, but it's not me unless I can somehow do that without using #catch.
What could it be?!
Got it!
I'm using an external accessory (Linea Pro-4 barcode scanner/MSR) that has its own library, and that is what is catching the exception, even in their newest version of the framework.
I set up my blank test project to connect to the accessory before running the same fetch request, and bam! Swallows the exception!
After upgrading to XCode4 (v. 4.2, 4D199) it seems every time my apps crash while debugging, the debugging points to main(), and the stack is unsymbolicated and useless.
This has been working fine for years, I have no idea what has gone wrong.
I'm using GDB. I also tried the LLDB as per this advice, and it didn't work either (similar, useless stack).
My breakpoints work, I get the full stack, and can inspect variables when my code hits those.
Steps to reproduce:
NB. this happens with my own project, but I'll use Apple's code here to remove that variable from the equation
Download the following sample from Apple: https://developer.apple.com/library/ios/#samplecode/UICatalog/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007710
In the ImagesViewController class, add the following code to the viewDidLoad method (so it will crash – we want it to crash for this test):
// please note: this code is designed to crash! I want it to crash, to highlight my issue with XCode.
NSMutableArray* test = [NSMutableArray new];
[test insertObject:NULL atIndex:0];
Then run the app & hit the 'Images' row.
It crashes with a message like:
2011-12-23 14:07:02.788 UICatalog[13394:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x37bbb8bf 0x316a11e5 0x37b1020f 0x699f 0x34fac7ff 0x34fb8c39 0x34fb8aa9 0x34fb898f 0x34fb815b 0x34fb7f53 0x34fac673 0x34fac349 0x66c1 0x35026565 0x3509ece7 0x31aec943 0x37b8fa63 0x37b8f6c9 0x37b8e29f 0x37b114dd 0x37b113a5 0x3768ffcd 0x34fa1743 0x2459 0x2418)
terminate called throwing an exception(gdb)
View in xcode:
Thanks to brigadir for pointing me to the solution!
It works well. Here's some screenshots for how to solve this for anyone finding my question:
Tap the plus button of the breakpoints tab
Then click Done