9

My app has been running fine in debugging mode through Xcode, but whenever it's downloaded through TestFlight, it crashes with this error: EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x000200013f7b9e78.

It's crashing at this line. I see specialized Array.withUnsafeMutableBufferPoint in this stack trace that it's probably related to.

self.array.sortInPlace. {
                (($0 as Dictionary<String, AnyObject>)["time"] as? String) > (($1 as Dictionary<String, AnyObject>)["time"] as? String)
            }

In Swift 1.3 I was using sort, and now in Swift 2 I'm using sortInPlace. Not sure if this makes a difference, but I do know that the result of sort isn't called because it's immutable.

Thread : Crashed: com.apple.main-thread
    0  libswiftCore.dylib             4302688056 _swift_retain_(swift::HeapObject*) + 8
    1  App                          4295962040 specialized LiveFeedViewController.(viewDidLoad(LiveFeedViewController) -> () -> ()).(closure #3).(closure #1) (LiveFeedViewController.swift)
    2  App                          4295785356 specialized thunk (LiveFeedViewController.swift)
    3  App                          4295953880 specialized _siftDown<A where ...> (inout A, A.Index, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool) -> () (LiveFeedViewController.swift)
    4  App                          4295952448 specialized _heapSort<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool) -> () (LiveFeedViewController.swift)
    5  App                          4295938144 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    6  App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    7  App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    8  App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    9  App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    10 App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    11 App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    12 App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    13 App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    14 App                          4295938120 specialized _introSortImpl<A where ...> (inout A, Range<A.Index>, inout (A.Generator.Element, A.Generator.Element) -> Bool, Int) -> () (LiveFeedViewController.swift)
    15 App                          4295960640 specialized specialized MutableCollectionType<A where ...>.sortInPlace<A where ...>((A.Generator.Element, A.Generator.Element) -> Bool) -> () (LiveFeedViewController.swift)
    16 App                          4295730388 _TPA__TTSg5GSaGVSs10DictionarySSPSs9AnyObject___GSaGS_SSPS0____Ss21MutableCollectionTypeSs_GVSs17IndexingGeneratorGSaGS_SSPS0_____GS2_GSaGS_SSPS0_____Ss13GeneratorTypeSs_GS_SSPS0____SiSiSs21RandomAccessIndexTypeSs_SiSiSs18_SignedIntegerTypeSs_SiSiSs33_BuiltinIntegerLiteralConvertibleSs_SiSiSs16SignedNumberTypeSs_SiSiS6_Ss_Si_GVSs10ArraySliceGS_SSPS0____GS8_GS_SSPS0____Ss9IndexableSsGS8_GS_SSPS0____Ss12SequenceTypeSs_GS2_GS8_GS_SSPS0_____GS2_GS8_GS_SSPS0_____S3_Ss_GS_SSPS0____SiSiSs16ForwardIndexTypeSs_SiSiS5_Ss_SiSiS6_Ss_Si_GS8_GS_SSPS0_____GS_SSPS0____GS_SSPS0______TFFeRq_Ss21MutableCollectionTypeqq_Ss16MutableIndexable5IndexSs21RandomAccessIndexType_SsS_11sortInPlaceuRq_S_qq_S0_5IndexS1__FRq_FFTqqq_Ss14CollectionType9GeneratorSs13GeneratorType7Elementqqq_S2_9GeneratorS3_7Element_SbT_U_FTGVSs20UnsafeMutablePointerQQQPS_9Generator7Element_Si_T_ (LiveFeedViewController.swift)
    17 App                          4295730548 _TPA__TTSg5GSaGVSs10DictionarySSPSs9AnyObject___GSaGS_SSPS0____Ss21MutableCollectionTypeSs_GVSs17IndexingGeneratorGSaGS_SSPS0_____GS2_GSaGS_SSPS0_____Ss13GeneratorTypeSs_GS_SSPS0____SiSiSs21RandomAccessIndexTypeSs_SiSiSs18_SignedIntegerTypeSs_SiSiSs33_BuiltinIntegerLiteralConvertibleSs_SiSiSs16SignedNumberTypeSs_SiSiS6_Ss_Si_GVSs10ArraySliceGS_SSPS0____GS8_GS_SSPS0____Ss9IndexableSsGS8_GS_SSPS0____Ss12SequenceTypeSs_GS2_GS8_GS_SSPS0_____GS2_GS8_GS_SSPS0_____S3_Ss_GS_SSPS0____SiSiSs16ForwardIndexTypeSs_SiSiS5_Ss_SiSiS6_Ss_Si_GS8_GS_SSPS0_____GS_SSPS0____GS_SSPS0______TTRGRq_Ss21MutableCollectionTypeqq_Ss16MutableIndexable5IndexSs21RandomAccessIndexType_XFo_dGVSs20UnsafeMutablePointerqqq_Ss14CollectionType9GeneratorSs13GeneratorType7Element_dSi_dT_zoPSs9ErrorType__XFo_dGS2_qqq_S3_9GeneratorS4_7Element_dSi_iT_zoPS5___ (LiveFeedViewController.swift)
    18 App                          4295730716 _TPA__TTSg5GVSs10DictionarySSPSs9AnyObject___T____TFFSa42_withUnsafeMutableBufferPointerIfSupportedu__rFRGSaq__FzFzTGVSs20UnsafeMutablePointerq__Si_qd__GSqqd___U_FzRGVSs26UnsafeMutableBufferPointerQd___Q_ (LiveFeedViewController.swift)
    19 App                          4295954668 specialized Array.withUnsafeMutableBufferPointer<A><B>((inout UnsafeMutableBufferPointer<A>) throws -> B) throws -> B (LiveFeedViewController.swift)
    20 App                          4295959880 specialized specialized MutableCollectionType<A where ...>.sortInPlace<A where ...>((A.Generator.Element, A.Generator.Element) -> Bool) -> () (LiveFeedViewController.swift)
    21 App                          4295895596 LiveFeedViewController.(viewDidLoad(LiveFeedViewController) -> () -> ()).(closure #3) (LiveFeedViewController.swift:1862)
    22 libdispatch.dylib              6875551464 _dispatch_call_block_and_release + 24
    23 libdispatch.dylib              6875551400 _dispatch_client_callout + 16
    24 libdispatch.dylib              6875573680 _dispatch_main_queue_callback_4CF + 1844
    25 CoreFoundation                 6518931960 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
    26 CoreFoundation                 6518923360 __CFRunLoopRun + 1628
    27 CoreFoundation                 6518066336 CFRunLoopRunSpecific + 384
    28 GraphicsServices               6704955528 GSEventRunModal + 180
    29 UIKit                          6609391612 UIApplicationMain + 204
    30 App                          4296344512 main (AppDelegate.swift:23)
    31 libdyld.dylib                  6875752632 start + 4

UPDATE:

This is all in Swift 2, and the array is an array of dictionaries, declared as var array = [[String:AnyObject]](). It's populated by appending a series of dictionaries, like this.

self.dict["foo"] = 0
self.dict["bar"] = "dog"
self.array.append(self.dict)

My concern is that its within a dispatch_group_notify; it's waiting on series of dispatch_group_leaves. Could that have something to do with it? That looks like this:

dispatch_group_notify(group, queue) { () -> Void in

      self.array.sortInPlace {
          (($0["foo"] as? Int) > (($1 )["foo"] as? Int))
      }
}
slider
  • 2,736
  • 4
  • 33
  • 69
  • So what is this array, how is it declared, how is it populated, what's in it? – matt Nov 07 '15 at 03:21
  • @matt see updated. Let me know if you need more info. – slider Nov 07 '15 at 03:31
  • This might not be relevant, but I'm having trouble seeing what sense it makes trying to sort _Optionals_. If you know these things are Int or String or whatever, you should be sorting them as Int or String or whatever. Is there some chance of failure as you cast, and if so, what are you expecting to happen in that case? – matt Nov 07 '15 at 04:25
  • I can't apply the binary operator to two `AnyObject`s, so I need to type cast the array's dictionary's values to something, in this case, Int. No chance of failing. I just unwrapped them, thanks for the catch, but I'm not sure if that's my big issue. – slider Nov 07 '15 at 04:28
  • Casting, fine. But you are casting _optionally_. `($0["foo"] as? Int` is not an Int. It's an Optional. As I say, this might be irrelevant, but it's a very odd thing to do in this situation. – matt Nov 07 '15 at 04:31
  • @matt I'm not sure if that would resolve my bug. Based on what I've already provided, is there something obvious that I shouldn't be doing? – slider Nov 08 '15 at 02:07
  • Was this ever solved? – Phil Nov 22 '15 at 20:17
  • @Phil: I [resolved it by replacing `sortInPlace` with `sort`](http://stackoverflow.com/a/33928586/35690). Looks like an Apple bug. – Senseful Nov 26 '15 at 00:09

4 Answers4

7

This is an old question, but the main reason it's difficult to reproduce EXC_BAD_ACCESS KERN_INVALID_ADDRESS in debug runs is because the life cycle of a deallocated object is different in debug versions and release versions. In the latter the memory is immediately gone and possibly replaced with an unrelated object whereas in the former the memory may still be retained for a short while so your app can still chugs along without problem. Also when this do happen in release version, the last line of the crash trace can be confusing because the referred object could be of some completely unrelated type. If that's the case we should look up a little bit in the stack tree and hopefully find more clues there.

CodeBrew
  • 6,457
  • 2
  • 43
  • 48
6

I'm getting the same issue but it only affects ~50% of devices, and only those running the release version of the app. My code is not using anything like dispatch_group.

In my case I was using code such as:

contacts.sortInPlace({ $0.name.localizedCaseInsensitiveCompare($1.name) == .OrderedAscending })

It was fixed when I replaced it with:

contacts = contacts.sort({ $0.name.localizedCaseInsensitiveCompare($1.name) == .OrderedAscending })

Since it only affects a limited amount of users, crashes in a low level Swift API, and is fixed by replacing with sort, I believe this is a bug in Apple's code.

I recommend filing a bug with Apple and using sort in the meantime.

Note: Another similarity between your code and mine is the usage of shorthand argument names (i.e. $0 and $1). However, even if I replace those with named arguments, it still crashes.

Update: Many people are experiencing the same issue on the apple forums. It seems to be fixed in the latest Xcode beta according to that thread.

Senseful
  • 86,719
  • 67
  • 308
  • 465
3

Regarding the code in UPDATE:

Since the array is populated "manually" the most reliable (and effective and conforming Swift's type safety) way is to use a custom class with non optional properties rather than a generic dictionary.

class Item {
  var foo : Int
  var bar : String

  init(foo : Int, bar : String) {
    self.foo = foo
    self.bar = bar
  }
}

var array = [Item]()
array.append(Item(foo: 0, bar: "dog"))
array.append(Item(foo: 1, bar: "cat"))

array.sortInPlace { $0.foo > $1.foo }

All types are well-known and non optional.

No type casting, no unwrapping, no overhead, no problem.

vadian
  • 274,689
  • 30
  • 353
  • 361
0

One case I came across this error is I've declared a nonnull property in Objective-C but forgot to initialize it, and then try to use it in Swift.

Hlung
  • 13,850
  • 6
  • 71
  • 90