Re: Crash with ARC enabled on Xcode 6.1
Re: Crash with ARC enabled on Xcode 6.1
- Subject: Re: Crash with ARC enabled on Xcode 6.1
- From: Beinan Li <email@hidden>
- Date: Fri, 24 Oct 2014 14:44:24 -0400
I'd like to thank everyone for your input.
I learned a lot from this thread.
BTW, simply changing the offending dictionary syntax to using the old API
instead of the literals didn't help.
I really had to abandon the singleton idea for the C++ wrapper object.
Correct me if I'm wrong, please. I think Greg's post clarifies things:
"""
The initialization order is generally like this:
1. Everything in libraries you link to is initialized.
2. Your classes' +load methods run. Each class runs +load before its
subclasses. (Timing of category +load is more complicated, but in most
cases they also run now.)
3. Your C and C++ static constructors run.
4. main()
"""
The offending C++ wrapper and the ObjC implementation it wraps are both in
a static library that the test app links to.
According to the order above, the static constructor of the C++ wrapper
actually runs after the wrapped ObjC object's dictionary is created, seems
a problem to me.
Thanks,
Beinan
On Fri, Oct 24, 2014 at 2:26 PM, Beinan Li <email@hidden> wrote:
> You nailed it, Kevin. Thanks so much!
>
> It is due to the static C++ wrapper object.
> After I moved it to the heap, the crash was fixed.
>
> Thanks,
> Beinan
>
>
> On Thu, Oct 23, 2014 at 12:50 PM, Kevin Meaney <email@hidden> wrote:
>
>> Personally I'd try and not call any objective-c code from a C++ static
>> object. If it did look the appropriate solution then I'd make sure I was
>> comfortable with my knowledge of the objective-c runtime and the order in
>> which things are called before main is called.
>>
>> Kevin
>>
>> On 23 Oct 2014, at 13:02, Beinan Li <email@hidden> wrote:
>>
>> Thank you Kevin!
>> I didn't know this before. This might be it because I did at some point
>> change the dictionary creation from the old API-based syntax to literals.
>> Maybe I should move back to the API calls. I'll try that today.
>>
>> Thanks,
>> Beinan
>>
>>
>> On Thu, Oct 23, 2014 at 5:18 AM, Kevin Meaney <email@hidden> wrote:
>>
>>>
>>> On 23 Oct 2014, at 00:34, Beinan Li <email@hidden> wrote:
>>>
>>> Oh! I did actually.
>>>
>>> The method I posted belongs to an ObjC object which is wrapped by a C++
>>> object.
>>> That C++ object is a singleton (static).
>>>
>>> How is this going to affect ARC and why it didn't down-right crash a
>>> week ago before I upgraded Xcode?
>>>
>>>
>>> I wouldn't worry about why it worked before. I don't think that helps,
>>> and if you have any other cases they should be removed as well.
>>>
>>> Array and dictionary literals are not evaluated at compile time but are
>>> replaced with the objective-c calls to create the arrays and dictionaries.
>>> This is very different to string literals.
>>>
>>> From what I understand any code that is executed before main is called
>>> is done so before the objective-c runtime is fully setup which means you
>>> have no guarantees about what will work. In objective-c++ where you can
>>> create static C++ objects that results in objective-c being called it is an
>>> easy way to make difficult to track crashes.
>>>
>>> I'd like confirmation from an apple engineer that my understanding is
>>> correct. My quick perusal of the docs didn't find the info I was after.
>>>
>>> Kevin
>>>
>>> Thanks,
>>> Beinan
>>>
>>>
>>> On Wed, Oct 22, 2014 at 7:00 PM, Kevin Meaney <email@hidden> wrote:
>>>
>>>> Your not creating a static C++ object anywhere are you? One that
>>>> creates the dictionary before main gets called by any chance?
>>>>
>>>> Kevin
>>>>
>>>> Sent from my iPhone
>>>>
>>>> > On 22 Oct 2014, at 22:45, Beinan Li <email@hidden> wrote:
>>>> >
>>>> > Note, the initial crashing function is merely translating a C++ enum
>>>> to the
>>>> > AVFoundation builtin constants.
>>>> >
>>>> > Thanks,
>>>> > Beinan
>>>> >
>>>> >
>>>> >> On Wed, Oct 22, 2014 at 5:45 PM, Beinan Li <email@hidden>
>>>> wrote:
>>>> >>
>>>> >> It is quite unpredictable.
>>>> >> At first it crashes at a dictionary creation line in a .mm
>>>> implementation
>>>> >> like this:
>>>> >>
>>>> >> - (NSString*) getAVAudioSessionMode:(myAudioSessionMode)modeKey {
>>>> >> NSDictionary* modeDict = @{ // Here it crashes
>>>> >> @(myAudioSessionModeDefault): AVAudioSessionModeDefault,
>>>> >> @(myAudioSessionModeVoiceChat): AVAudioSessionModeVoiceChat,
>>>> >> @(myAudioSessionModeGameChat): AVAudioSessionModeGameChat,
>>>> >> @(myAudioSessionModeVideoRecording):
>>>> AVAudioSessionModeVideoRecording,
>>>> >> @(myAudioSessionModeMeasurement): AVAudioSessionModeMeasurement,
>>>> >> @(myAudioSessionModeMoviePlayback):
>>>> AVAudioSessionModeMoviePlayback,
>>>> >> @(myAudioSessionModeVideoChat): AVAudioSessionModeVideoChat
>>>> >> };
>>>> >> NSString* mode = [modeDict objectForKey:@
>>>> >> (mySettings.audioSession.eMode)];
>>>> >> return mode;
>>>> >> }
>>>> >>
>>>> >> The backtrace gives me:
>>>> >>
>>>> >> * thread #1: tid = 0x2403, 0x0013148c MyDemo`-[MyImp
>>>> >> getAVAudioSessionMode:](self=0x1e839a80, _cmd=0x002d3077,
>>>> >> modeKey=myAudioSessionModeDefault) + 676 at MyImp.mm:78, queue =
>>>> >> 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1,
>>>> address=0x0)
>>>> >> * frame #0:
>>>> >> 0x0013148c MyDemo -[MyImp getAVAudioSessionMode:](self=0x1e839a80,
>>>> >> _cmd=0x002d3077, modeKey=myAudioSessionModeDefault) + 676 at
>>>> MyImp.mm:78
>>>> >>
>>>> >> Then if I remove this dictionary all together and do it like this:
>>>> >>
>>>> >> - (NSString*) getAVAudioSessionMode:(myAudioSessionMode)modeKey {
>>>> >> return AVAudioSessionModeDefault;
>>>> >> }
>>>> >>
>>>> >> Then I get a crash right in the main.mm:
>>>> >>
>>>> >> int retVal = UIApplicationMain(argc, argv, nil,
>>>> @"MyDemoAppDelegate");
>>>> >>
>>>> >> backtrace:
>>>> >>
>>>> >> * thread #1: tid = 0x2403, 0x3c4df350
>>>> >> libsystem_kernel.dylib`__pthread_kill + 8, queue =
>>>> 'com.apple.main-thread',
>>>> >> stop reason = signal SIGABRT
>>>> >> frame #0: 0x3c4df350 libsystem_kernel.dylib`__pthread_kill + 8
>>>> >> frame #1: 0x3c456122 libsystem_c.dylib`pthread_kill + 58
>>>> >> frame #2: 0x3c492972 libsystem_c.dylib`abort + 94
>>>> >> frame #3: 0x3ba30d4e libc++abi.dylib`abort_message + 74
>>>> >> frame #4: 0x3ba2dff8 libc++abi.dylib`default_terminate() + 24
>>>> >> frame #5: 0x3bfe1a
>>>>
>>>
>>>
>>>
>>
>>
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden