App crash on adding a new property in swift Decodable model object - ios

Below is my sample code. Everything working perfectly but if trying to add a new property in PageLoad or TestDetailResponseModel struct then the app is getting crash. There is no issue in API response and parsing. Getting parsed value in the print statement. According to the crash log, it's something related to memory but I am unable to figure it out. Below is my sample code. My API response is approx 40 KB. Please help me.
Note-
I am not mutating the response objects only consuming.
If change PageLoad from struct to class app is not crashing
import RxCocoa
import RxSwift
public struct TestDetailViewModel {
private func getTestDetailSuccessResponse() -> Driver<TestDetailResponseModel?> {
//Make API call asynchronously using RxSwift and storing result in testDetailResponseModel
let testDetailResponseModel: TestDetailResponseModel? = RXNetworkManager.execute(request: MyRequestModel) {
//Api Response
//Parse response. Parsing is proper. responseModel prints all the parsed properties with correct values of TestDetailResponseModel and PageLoad objects (detail, and pageNumber)
print(responseModel)
}
return Driver.just(testDetailResponseModel)
}
private func loadDetail() {
let isDetailExist = getTestDetailSuccessResponse().compactMap { response -> Bool? in
print(response) //No Crash
print(response?.pageLoad) //App crashed here if add pageNumber property in PageLoad object
return response?.pageLoad != nil
}
}
}
public struct TestDetailResponseModel: Decodable {
public let pageLoad: PageLoad?
//...
}
public struct PageLoad: Decodable {
public let detail: String?
//...
public let pageNumber: Double? //New property
}
=================Crash Report for same====================
Exception Type: EXC_BAD_ACCESS (SIGABRT)
Exception Subtype: KERN_INVALID_ADDRESS at 0x50a01fb550981f18 -> 0xffff9fb550981f18 (possible pointer authentication failure)
Exception Codes: 0x0000000000000001, 0x50a01fb550981f18
VM Region Info: 0xffff9fb550981f18 is not in any region. Bytes after previous region: 18446532646169747225
REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL
MALLOC_NANO (reserved) 600018000000-600020000000 [128.0M] rw-/rwx SM=NUL ...(unallocated)
--->
UNUSED SPACE AT END
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0
Application Specific Information:
=================================================================
==17015==ERROR: AddressSanitizer: SEGV on unknown address 0x50a01fb550981f18 (pc 0x00018f9e1d50 bp 0x00016bbf60c0 sp 0x00016bbf6080 T0)
==17015==The signal is caused by a UNKNOWN memory access.
#0 0x18f9e1d50 in swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::incrementSlow(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int)+0x2c (libswiftCore.dylib:arm64+0x302d50)
#1 0x18f9b20bc in _swift_retain_+0x54 (libswiftCore.dylib:arm64+0x2d30bc)
#2 0x10d8d5edc (liboainject.dylib:arm64+0x5edc)
#3 0x18f9e7958 in swift_bridgeObjectRetain+0x30 (libswiftCore.dylib:arm64+0x308958)
#4 0x1191ab100 in outlined copy of PageLoad?+0x1dc (TestCore:arm64+0x10ff100)
#5 0x1196cf554 in outlined copy of TestDetailResponseModel?+0x6a4 (TestCore:arm64+0x1623554)
#6 0x11a1541bc in TestDetailViewModel.getTestDetailSuccessResponse(response:) TestDetailViewModel+APICalls.swift:69
#7 0x1195240b8 in closure #13 in TestDetailViewModel.transform(input:) TestDetailViewModel.swift:108
#8 0x10e59b30c in CompactMapSink.on(_:) CompactMap.swift:47
#9 0x10e59b550 in protocol witness for ObserverType.on(_:) in conformance CompactMapSink<A, B> <compiler-generated>
#10 0x10e5f91d0 in partial apply for implicit closure #2 in implicit closure #1 in ShareWhileConnectedConnection._synchronized_subscribe<A>(_:) <compiler-generated>
#11 0x10e58d8d8 in thunk for #escaping #callee_guaranteed (#in_guaranteed Event<A>) -> () <compiler-generated>
#12 0x10e5f804c in ShareReplay1WhileConnectedConnection.on(_:)+0x70 (RxSwift:arm64+0x8804c)
#13 0x10e5f7bf4 in protocol witness for ObserverType.on(_:) in conformance ShareReplay1WhileConnectedConnection<A> <compiler-generated>
#14 0x10e5b0514 in Sink.forwardOn(_:) Sink.swift:34
#15 0x10e582398 in SwitchSinkIter._synchronized_on(_:) Switch.swift:160
#16 0x10e5abb68 in SynchronizedOnType.synchronizedOn(_:) SynchronizedOnType.swift:16
#17 0x10e582488 in protocol witness for ObserverType.on(_:) in conformance SwitchSinkIter<A, B, C> <compiler-generated>
#18 0x10e5f91d0 in partial apply for implicit closure #2 in implicit closure #1 in ShareWhileConnectedConnection._synchronized_subscribe<A>(_:) <compiler-generated>
#19 0x10e58d8d8 in thunk for #escaping #callee_guaranteed (#in_guaranteed Event<A>) -> () <compiler-generated>
#20 0x10e5f804c in ShareReplay1WhileConnectedConnection.on(_:)+0x70 (RxSwift:arm64+0x8804c)
#21 0x10e5f7bf4 in protocol witness for ObserverType.on(_:) in conformance ShareReplay1WhileConnectedConnection<A> <compiler-generated>
#22 0x10e5b0514 in Sink.forwardOn(_:) Sink.swift:34
#23 0x10e59d0c8 in CatchSink.on(_:) Catch.swift:131
#24 0x10e59d31c in protocol witness for ObserverType.on(_:) in conformance CatchSink<A> <compiler-generated>
#25 0x10e605534 in closure #1 in ObserveOnSerialDispatchQueueSink.init(scheduler:observer:cancel:) ObserveOn.swift:184
#26 0x10e605d48 in partial apply for thunk for #escaping #callee_guaranteed (#guaranteed ObserveOnSerialDispatchQueueSink<A>, #in_guaranteed Event<A.ObserverType.Element>) -> (#out Disposable) <compiler-generated>
#27 0x10e5904e4 in partial apply for closure #1 in MainScheduler.scheduleInternal<A>(_:action:) <compiler-generated>
#28 0x10e585410 in thunk for #escaping #callee_guaranteed () -> () <compiler-generated>
#29 0x1139f950c in __wrap_dispatch_async_block_invoke+0xb8 (libclang_rt.asan_iossim_dynamic.dylib:arm64+0x3d50c)
#30 0x18010d240 in _dispatch_call_block_and_release+0x14 (libdispatch.dylib:arm64+0x2240)
#31 0x18010ea94 in _dispatch_client_callout+0xc (libdispatch.dylib:arm64+0x3a94)
#32 0x18011c418 in _dispatch_main_queue_drain+0x3cc (libdispatch.dylib:arm64+0x11418)
#33 0x18011c038 in _dispatch_main_queue_callback_4CF+0x24 (libdispatch.dylib:arm64+0x11038)
#34 0x180361c28 in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__+0x8 (CoreFoundation:arm64+0x85c28)
#35 0x18035c0ac in __CFRunLoopRun+0x97c (CoreFoundation:arm64+0x800ac)
#36 0x18035b214 in CFRunLoopRunSpecific+0x238 (CoreFoundation:arm64+0x7f214)
#37 0x18c25f608 in GSEventRunModal+0x9c (GraphicsServices:arm64+0x3608)
#38 0x184d88a94 in -[UIApplication _run]+0x3dc (UIKitCore:arm64+0xc0da94)
#39 0x184d8d630 in UIApplicationMain+0x6c (UIKitCore:arm64+0xc12630)
#40 0x104dc5958 in main AppDelegate.swift:32
#41 0x10b66dcd4 in start_sim+0x10 (dyld_sim:arm64+0x1cd4)
#42 0x10b71d084 (<unknown module>)
#43 0xa777ffffffffffc (<unknown module>)
==17015==Register values:
x[0] = 0x000000018035ba08 x[1] = 0xaa1403f6aa1303e1 x[2] = 0x0000000000000001 x[3] = 0x0000000000000001
x[4] = 0x0000000000000000 x[5] = 0x0000000000000000 x[6] = 0x0000000000000000 x[7] = 0x0000000000000000
x[8] = 0x50a01fb550981f08 x[9] = 0x000000018035ba00 x[10] = 0xffffffffffffffff x[11] = 0xaa1403f8aa1303e1
x[12] = 0x0000000000000000 x[13] = 0x0000000000000000 x[14] = 0x0000000000000000 x[15] = 0x0000000000000000
x[16] = 0x00000001cc0ac98c x[17] = 0x0000000000000000 x[18] = 0x0000000000000000 x[19] = 0x000000016bbf6118
x[20] = 0x000000018035ba00 x[21] = 0x000000010d8dc000 x[22] = 0x000000016bbf60f8 x[23] = 0x000000010d8dc000
x[24] = 0x000000010d8dc000 x[25] = 0x0000000000000000 x[26] = 0x40c1d7097c1bda51 x[27] = 0x4000000153eb88d0
x[28] = 0xc000000000000030 fp = 0x000000016bbf60c0 lr = 0x000000018f9b20c0 sp = 0x000000016bbf6080
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (libswiftCore.dylib:arm64+0x302d50) in swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::incrementSlow(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int)+0x2c
==17015==ABORTING
dyld4 config: DYLD_ROOT_PATH=/Applications/Xcode_13.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot DYLD_INSERT_LIBRARIES=/Applications/Xcode_13.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DVTInstrumentsFoundation.framework/liboainject.dylib
CoreSimulator 802.6.1 - Device: iPhone 13 Pro Max (********-****-****-****-************) - Runtime: iOS 15.5 (19F70) - DeviceType: iPhone 13 Pro Max
dyld4 config: DYLD_ROOT_PATH=/Applications/Xcode_13.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot DYLD_INSERT_LIBRARIES=/Applications/Xcode_13.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DVTInstrumentsFoundation.framework/liboainject.dylib
abort() called
Kernel Triage:
VM - Compressor failed a blocking pager_get
VM - Compressor failed a blocking pager_get
VM - Compressor failed a blocking pager_get
VM - Compressor failed a blocking pager_get

There is not much information, but I can guess what the problem is
Any Api call asynchronous, and you need use #escaping completion for handle result of dataTask
private func getTestDetailSuccessResponse(completion: #escaping (TestDetailResponseModel>)->Void) {
var testDetailResponseModel: TestDetailResponseModel?
// Make api call
// return result of call into completion as "completion(result)"
}
Using:
private func loadDetail() {
getTestDetailSuccessResponse { result in
let detail = result?.pageLoad
}
}

Related

Crash in ForEach when deleting element with NavigationView and sheet

Using Xcode 13's new binding variant of ForEach my app crashes predictably on-device (but works in the simulator) when deleting any element other than the last one from content backed by an #Published property.
Strangely, this only happens when the view is contained within a NavigationView and has a sheet attached.
Here is a self-contained app demonstrating the issue:
import SwiftUI
struct Vegetable: Identifiable {
let id: UUID
let name: String
}
class MyModel: ObservableObject {
#Published var vegetables: [Vegetable] = [
Vegetable(id: UUID(), name: "Eggplant"),
Vegetable(id: UUID(), name: "Corn"),
Vegetable(id: UUID(), name: "Radish")
]
}
#main
struct SwiftUIForEachTestApp: App {
#StateObject var model = MyModel()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(model)
}
}
}
struct ContentView: View {
var body: some View {
// Remove the containing NavigationView and the crash disappears
NavigationView {
MyView()
}
}
}
struct MyView: View {
#EnvironmentObject private var model: MyModel
#State private var isPresentingSheet = false
var body: some View {
List {
ForEach($model.vegetables) { $vegetable in
Text(vegetable.name)
}
.onDelete { indices in model.vegetables.remove(atOffsets: indices) }
}
// Remove the sheet and the crash disappears
.sheet(isPresented: $isPresentingSheet) {
}
}
}
Running the app and deleting the top row results in the following crash (line 16 corresponds to #main):
#0 0x00000001a73a6eac in _swift_runtime_on_report ()
#1 0x00000001a741f100 in _swift_stdlib_reportFatalErrorInFile ()
#2 0x00000001a705e668 in closure #1 in closure #1 in closure #1 in _assertionFailure(_:_:file:line:flags:) ()
#3 0x00000001a705dce0 in _assertionFailure(_:_:file:line:flags:) ()
#4 0x00000001a703c6b4 in _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds(_:wasNativeTypeChecked:) ()
#5 0x00000001a7041e2c in Array.subscript.read ()
#6 0x00000001a7041d58 in protocol witness for Collection.subscript.read in conformance [τ_0_0] ()
#7 0x0000000100320c38 in closure #1 in ForEach<>.init<τ_0_0>(_:id:content:) ()
#8 0x0000000100320f48 in partial apply for closure #1 in ForEach<>.init<τ_0_0>(_:id:content:) ()
#9 0x0000000100320fd8 in thunk for #escaping #callee_guaranteed (#in_guaranteed τ_1_0.Collection.Index) -> (#out τ_1_0.Collection.Index, #out τ_0_1) ()
#10 0x0000000100321090 in partial apply for thunk for #escaping #callee_guaranteed (#in_guaranteed τ_1_0.Collection.Index) -> (#out τ_1_0.Collection.Index, #out τ_0_1) ()
#11 0x00000001a7193d0c in LazyMapSequence<>.subscript.read ()
#12 0x00000001a71938e4 in protocol witness for Collection.subscript.read in conformance <> LazyMapSequence<τ_0_0, τ_0_1> ()
#13 0x00000001aa2a374c in ForEach.IDGenerator.makeID(data:index:offset:) ()
#14 0x00000001aa2abf54 in ForEachState.ForEachViewIDCollection.subscript.getter ()
#15 0x00000001aa2ac914 in ForEachState.ForEachViewIDCollection.subscript.read ()
#16 0x00000001aa2ac84c in protocol witness for Collection.subscript.read in conformance ForEachState<τ_0_0, τ_0_1, τ_0_2>.ForEachViewIDCollection ()
#17 0x00000001aa37a838 in _ViewList_ID._Views.subscript.getter ()
#18 0x00000001aa37a3f4 in protocol witness for Collection.subscript.read in conformance _ViewList_ID.Views ()
#19 0x00000001a71eaecc in Slice.subscript.getter ()
#20 0x00000001a71ed008 in Slice.subscript.read ()
#21 0x00000001a71ecf48 in protocol witness for Collection.subscript.read in conformance Slice<τ_0_0> ()
#22 0x00000001a7193cc8 in LazyMapSequence<>.subscript.read ()
#23 0x00000001a71938e4 in protocol witness for Collection.subscript.read in conformance <> LazyMapSequence<τ_0_0, τ_0_1> ()
#24 0x00000001aa157f44 in ShadowRowCollection.subscript.getter ()
#25 0x00000001aa1580ec in ShadowRowCollection.subscript.read ()
#26 0x00000001aa15802c in protocol witness for Collection.subscript.read in conformance ShadowRowCollection<τ_0_0> ()
#27 0x00000001aa365448 in ListCoreDataSource.rowID(at:) ()
#28 0x00000001aa004ec0 in closure #1 in performUpdates #1 <τ_0_0, τ_0_1>() in ListCoreCoordinator.updateUITableView(_:to:transaction:) ()
#29 0x00000001a9ffd09c in specialized _ArrayProtocol.filter(_:) ()
#30 0x00000001aa004658 in performUpdates #1 <τ_0_0, τ_0_1>() in ListCoreCoordinator.updateUITableView(_:to:transaction:) ()
#31 0x00000001aa00565c in closure #1 in ListCoreCoordinator.updateUITableView(_:to:transaction:) ()
#32 0x00000001a9ec6008 in thunk for #escaping #callee_guaranteed () -> () ()
#33 0x00000001a9eaee84 in static Update.end() ()
#34 0x00000001a9cd7390 in static NSRunLoop.flushObservers() ()
#35 0x00000001a9cd72d8 in closure #1 in closure #1 in static NSRunLoop.addObserver(_:) ()
#36 0x00000001a9cd2250 in specialized thunk for #callee_guaranteed () -> (#error #owned Error) ()
#37 0x00000001c9b53f24 in autoreleasepool<τ_0_0>(invoking:) ()
#38 0x00000001a9cd72b8 in closure #1 in static NSRunLoop.addObserver(_:) ()
#39 0x00000001a9cd7410 in #objc closure #1 in static NSRunLoop.addObserver(_:) ()
#40 0x00000001a3437588 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#41 0x00000001a34316ac in __CFRunLoopDoObservers ()
#42 0x00000001a3431c58 in __CFRunLoopRun ()
#43 0x00000001a3431308 in CFRunLoopRunSpecific ()
#44 0x00000001baab4734 in GSEventRunModal ()
#45 0x00000001a5eaf75c in -[UIApplication _run] ()
#46 0x00000001a5eb4fcc in UIApplicationMain ()
#47 0x00000001aa39c380 in closure #1 in KitRendererCommon(_:) ()
#48 0x00000001aa39c30c in runApp<τ_0_0>(_:) ()
#49 0x00000001a9e94b38 in static App.main() ()
#50 0x000000010031c9c4 in static SwiftUIForEachTestApp.$main() at /xxx/SwiftUIForEachTest/Shared/ContentView.swift:16
#51 0x000000010031e888 in main ()
#52 0x00000001a30edcf8 in start ()
Is this a bug in SwiftUI?
works very well for me on macos 12.beta, xcode 13.beta, target ios 15 and macCatalyst.
Tested on mac, iPhone and iPad. Maybe it is different on older systems.
EDIT: using EnvironmentObject, this is the code I'm using in my tests:
import SwiftUI
#main
struct TestApp: App {
#StateObject var model = MyModel() // <---
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(model)
}
}
}
struct ContentView: View {
#EnvironmentObject var model: MyModel // <---
var body: some View {
NavigationView {
MyView()
}
}
}
struct MyView: View {
#EnvironmentObject var model: MyModel // <---
#State private var isPresentingSheet = false
var body: some View {
List {
ForEach($model.vegetables) { $vegetable in
Text(vegetable.name)
}
.onDelete { indices in model.vegetables.remove(atOffsets: indices) }
}
.sheet(isPresented: $isPresentingSheet) {
Text("the sheet") // <----
}
}
}
struct Vegetable: Identifiable {
let id: UUID
let name: String
}
class MyModel: ObservableObject {
#Published var vegetables: [Vegetable] = [
Vegetable(id: UUID(), name: "Eggplant"),
Vegetable(id: UUID(), name: "Corn"),
Vegetable(id: UUID(), name: "Radish")
]
}

EXC_BAD_ACCESS when safely unwrapping optional on NSManagedObject

I have the following base NSManagedObject in our Application:
#objc(LaravelEntity)
class LaravelEntity: NSManagedObject {
static func create(moc: NSManagedObjectContext) -> LaravelEntity? {
let entityName = NSStringFromClass(self)
let ent = NSEntityDescription.insertNewObject(forEntityName: entityName, into: moc) as? LaravelEntity
// We set local changes to true, so it will definitely be pushed to the server
ent?.local_changes = true
return ent
}
static func lastUpdatedRequest() -> NSFetchRequest<LaravelEntity> {
let request : NSFetchRequest<LaravelEntity> = self.self.fetchRequest()
let sort = NSSortDescriptor(key: #keyPath(LaravelEntity.updated_at), ascending: false)
request.sortDescriptors = [sort]
request.fetchLimit = 1
return request
}
}
I also have some subclasses of this. They are defined as subclasses in the DataModel as well:
#objc(Answer)
class Answer: LaravelEntity {
}
I try to fetch the last updated entity for a given class like this:
func lastUpdated(klass: LaravelEntity.Type, ctx : NSManagedObjectContext? = nil) -> LaravelEntity? {
do {
let request = klass.lastUpdatedRequest()
let result = try ctx?.fetch(request) ?? self.persistentContainer.newBackgroundContext().fetch(request)
return result.first
} catch {
print("Error while fetching last updated: \(error)!")
}
return nil
}
This works great for the most part. However, sporadically the application just crashes when trying to do something as simple as querying the id: lastUpdated?.id == 1. I have no idea why this would crash, as all optionals are safely handled (as far as I can tell). Also, when looking at the objects in the debugger, they display fine (e.g. po lastUpdated?.id == 1 returns true in the debugger).
I have created the following example test case to reproduce the problem, somewhat consistently:
func testLastUpdated() {
for i in 0...1000 {
let cases = [Location.self, Position.self, Answer.self, Question.self]
for kase in cases {
let old = kase.create(moc: sm.persistentContainer.viewContext)
let new = kase.create(moc: sm.persistentContainer.viewContext)
XCTAssert(old != nil, "Couldn't create old \(kase) object!")
XCTAssert(new != nil, "Couldn't create new \(kase) object!")
old?.updated_at = Date(timeIntervalSinceNow: TimeInterval(-60*60*24 + i * 60))
old?.id = Int32(i*2)
new?.updated_at = Date(timeIntervalSinceNow: TimeInterval(i*60))
new?.id = Int32(i*2+1)
try! sm.persistentContainer.viewContext.save()
let last_updated = sm.lastUpdated(klass: kase)
XCTAssert(last_updated?.id == new?.id, "Last updated \(kase) doesn't have the correct id \(last_updated?.id ?? -1) vs \(new?.id ?? -1)!") //It crashes on this line.
}
}
}
However, even with a 1000 repetitions, it only crashes about 1/3 of the time I run the test. Additionally, it only crashes in the low 50s of iterations.
The following is the callstack when running the above test:
#0 0x00000001857f8430 in objc_msgSend ()
#1 0x0000000188e1f274 in -[NSPersistentStoreCoordinator _canRouteToStore:forContext:] ()
#2 0x0000000188e21f38 in __110-[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:]_block_invoke ()
#3 0x0000000188e29af0 in gutsOfBlockToNSPersistentStoreCoordinatorPerform ()
#4 0x0000000185f19048 in _dispatch_client_callout ()
#5 0x0000000185f5b760 in _dispatch_sync_invoke_and_complete_recurse ()
#6 0x0000000185f5b26c in _dispatch_sync_wait ()
#7 0x0000000188e17f74 in _perform ()
#8 0x0000000188e17d2c in -[NSPersistentStoreCoordinator _routeLightweightBlock:toStore:] ()
#9 0x0000000188d4bc94 in -[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:] ()
#10 0x0000000188d34d7c in _PFFaultHandlerFulfillFault ()
#11 0x0000000188d32a80 in _PFFaultHandlerLookupRow ()
#12 0x0000000188d32334 in _PF_FulfillDeferredFault ()
#13 0x0000000188dd7644 in _pvfk_header ()
#14 0x0000000188dd7450 in _sharedIMPL_pvfk_core_i ()
#15 0x00000001092484a4 in implicit closure #5 in SyncManagerTests.testLastUpdated() at CDTests.swift:74
#16 0x00000001092589d4 in partial apply for implicit closure #5 in SyncManagerTests.testLastUpdated() ()
#17 0x00000001092a5bdc in partial apply for closure #1 in XCTAssertTrue(_:_:file:line:) ()
#18 0x00000001092a5448 in partial apply for closure #1 in _XCTRunThrowableBlock(_:) ()
#19 0x0000000109290224 in thunk for #callee_owned () -> () ()
#20 0x00000001092a6048 in _XCTRunThrowableBlockBridge ()
#21 0x00000001092943bc in specialized _XCTRunThrowableBlock(_:) ()
#22 0x0000000109296118 in specialized XCTAssertTrue(_:_:file:line:) ()
#23 0x000000010929045c in XCTAssert(_:_:file:line:) ()
#24 0x0000000109248010 in SyncManagerTests.testLastUpdated() at CDTests.swift:74
#25 0x0000000109248aa8 in #objc SyncManagerTests.testLastUpdated() ()
#26 0x000000018659d670 in __invoking___ ()
#27 0x000000018647c6cc in -[NSInvocation invoke] ()
#28 0x0000000107996654 in __24-[XCTestCase invokeTest]_block_invoke.275 ()
#29 0x00000001079e4208 in -[XCTMemoryChecker _assertInvalidObjectsDeallocatedAfterScope:] ()
#30 0x0000000107996404 in __24-[XCTestCase invokeTest]_block_invoke ()
#31 0x00000001079dc9d8 in -[XCUITestContext performInScope:] ()
#32 0x000000010799614c in -[XCTestCase invokeTest] ()
#33 0x0000000107997224 in __26-[XCTestCase performTest:]_block_invoke.382 ()
#34 0x00000001079e1a78 in +[XCTContext runInContextForTestCase:block:] ()
#35 0x0000000107996c20 in -[XCTestCase performTest:] ()
#36 0x0000000107992e14 in __27-[XCTestSuite performTest:]_block_invoke ()
#37 0x000000010799283c in -[XCTestSuite _performProtectedSectionForTest:testSection:] ()
#38 0x0000000107992a4c in -[XCTestSuite performTest:] ()
#39 0x0000000107992e14 in __27-[XCTestSuite performTest:]_block_invoke ()
#40 0x000000010799283c in -[XCTestSuite _performProtectedSectionForTest:testSection:] ()
#41 0x0000000107992a4c in -[XCTestSuite performTest:] ()
#42 0x0000000107992e14 in __27-[XCTestSuite performTest:]_block_invoke ()
#43 0x000000010799283c in -[XCTestSuite _performProtectedSectionForTest:testSection:] ()
#44 0x0000000107992a4c in -[XCTestSuite performTest:] ()
#45 0x00000001079eb484 in __44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke ()
#46 0x00000001079a5994 in -[XCTestObservationCenter _observeTestExecutionForBlock:] ()
#47 0x00000001079eb300 in -[XCTTestRunSession runTestsAndReturnError:] ()
#48 0x00000001079823d4 in -[XCTestDriver runTestsAndReturnError:] ()
#49 0x00000001079e0c20 in _XCTestMain ()
#50 0x000000018653e0fc in __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ ()
#51 0x000000018653d9cc in __CFRunLoopDoBlocks ()
#52 0x000000018653b6dc in __CFRunLoopRun ()
#53 0x000000018645bfb8 in CFRunLoopRunSpecific ()
#54 0x00000001882f3f84 in GSEventRunModal ()
#55 0x000000018fa302e8 in UIApplicationMain ()
#56 0x000000010137f528 in main at AppDelegate.swift:13
#57 0x0000000185f7e56c in start ()
I have no idea what could cause such a crash, since all optionals are handled correctly.
Edit 1: So the crash definitely happens on the following line last_updated?.id == new?.id (Which still doesn't make any sense to me). Even if I comment out all code changing the objects and only create one object, it still crashes (randomly) on lastUpdated?.id != nil.
Core data is not thread safe. Every context has one and only one thread that is can be read or written from. If you violate this, the behavior is UNDEFINED. Which means that it may crash or it may not. It may wait for 10 minutes and then crash when you do something unrelated.
In your code you are creating a newBackgroundContext inside func lastUpdated (because you are passing a nil context). Doing a fetch with this context is illegal. You can only use this context with performBlock or performBlockAndWait.
Also you have an extra self. in lastUpdatedRequest

Parallel.for going to sleep

I am running some code written in F# with mono and I have seen that after some time running (weeks), some process are in sleep mode. Using strace as strace -p <pid> I get
Process 38756 attached - interrupt to quit
futex(0x272ee9c, FUTEX_WAIT_PRIVATE, 1, NULL
Which as far as I understand it means that some part is awaiting for something (other threads).
So I continued searching the problem with gdb attach <pid> in which I can see that there are 4 threads as:
(gdb) info threads
4 Thread 0x7ff06a3ff700 (LWP 38760) 0x0000003b3c80b5bc in pthread_cond_wait##GLIBC_2.3.2 () from /lib64/libpthread.so.0
3 Thread 0x7ff06aa17700 (LWP 38769) 0x0000003b3c80d930 in sem_wait () from /lib64/libpthread.so.0
2 Thread 0x7ff0677ff700 (LWP 38789) 0x0000003b3c80b5bc in pthread_cond_wait##GLIBC_2.3.2 () from /lib64/libpthread.so.0
* 1 Thread 0x7ff070a07760 (LWP 38756) 0x0000003b3c80b5bc in pthread_cond_wait##GLIBC_2.3.2 () from /lib64/libpthread.so.0
On thread 1 using where I can see that the place where it is not working is a Parallel.For().
From my part, the code where the process goes to sleep is:
let sinMod t (difRay:Vector) (fA:(float*Vector*float)[]) =
let duepi = 2.*PI
Array.fold(fun acc x -> let freq, amplitude, phase = fA.[x]
acc+sin(duepi*freq*t+phase)*(amplitude*difRay)) 0. [|0..fA.Length-1|]
let NextFunc (var1:type1,var2:type2,var3:type3) =
// do some stuff
...
// some context
let time = snd var3
let inputArray = var.SomeArray // float[]
// the function that doesn't works
Parallel.For(0, (inputArray .Length), fun i -> (inputArray .[i] <- inputArray .[i]+(ww*SINMOD time.[i])) ) |> ignore
inputArray // return from NextFunc
I really don't have any idea where is the problem. Sometimes the process goes to sleep and others this is not happening. I don't know if this can have any relation, but the length of the parallel.for is 40960
Why is the program going to sleep?
Thank you
EDIT:
I haven't specified why I believe the problem is happening in a function like I said. Using gdb I obtain:
(gdb) where
#0 0x0000003b3c80b5bc in pthread_cond_wait##GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x000000000060cd0d in mono_os_cond_wait (cond=0x272ee98, mutex=0x272ee70, timeout_ms=4294967295) at ../../mono/utils/mono-os-mutex.h:105
#2 mono_os_cond_timedwait (cond=0x272ee98, mutex=0x272ee70, timeout_ms=4294967295) at ../../mono/utils/mono-os-mutex.h:120
#3 0x000000000060f0c8 in _wapi_handle_timedwait_signal_handle (handle=0x410, timeout=4294967295, alertable=1, poll=0, alerted=0x7fff27d2a6cc)
at handles.c:1554
#4 0x00000000006245ea in wapi_WaitForSingleObjectEx (handle=0x410, timeout=4294967295, alertable=1) at wait.c:173
#5 0x00000000005b01f2 in ves_icall_System_Threading_Monitor_Monitor_wait (obj=0x7fed09df4cc0, ms=4294967295) at monitor.c:1294
#6 0x00007ff06806385e in System.Threading.Monitor:Wait (obj=<type 'exceptions.ValueError'>
zero length field name in format
140656049605824, millisecondsTimeout=-1) at /root/mono-4.3.2/mcs/class/corlib/System.Threading/Monitor.cs:148
#7 0x00007ff067e69dc2 in System.Threading.ManualResetEventSlim:Wait (this=..., millisecondsTimeout=-1, cancellationToken=0)
at /root/mono-4.3.2/external/referencesource/mscorlib/system/threading/ManualResetEventSlim.cs:669
#8 0x00007ff067e8544e in System.Threading.Tasks.Task:SpinThenBlockingWait (this=..., millisecondsTimeout=-1, cancellationToken=0)
at /root/mono-4.3.2/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:3326
#9 0x00007ff067e8255d in System.Threading.Tasks.Task:InternalRunSynchronously (this=..., scheduler=..., waitForCompletion=true)
at /root/mono-4.3.2/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:1231
#10 0x00007ff067e823c8 in System.Threading.Tasks.Task:RunSynchronously (this=..., scheduler=...)
at /root/mono-4.3.2/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:1169
#11 0x00007ff067e77c03 in System.Threading.Tasks.Parallel:ForWorker<TLocal_REF> (fromInclusive=0, toExclusive=40960, parallelOptions=..., body=...,
bodyWithState=..., bodyWithLocal=..., localInit=..., localFinally=...)
at /root/mono-4.3.2/external/referencesource/mscorlib/system/threading/Tasks/Parallel.cs:1273
#12 0x00007ff067e76b8a in System.Threading.Tasks.Parallel:For (fromInclusive=0, toExclusive=40960, body=...)
at /root/mono-4.3.2/external/referencesource/mscorlib/system/threading/Tasks/Parallel.cs:441
#13 0x00000000402c11ee in ?? ()
#14 0x00007fff27d2aec0 in ?? ()
#15 0x00007ff0167eab00 in ?? ()
#16 0x0000000000000016 in ?? ()
#17 0x00007fef394db070 in ?? ()
#18 0x0000000000000000 in ?? ()
(gdb) p mono_pmip(0x00000000402c11ee)
$1 =
0x29ae0f0 " ShadingNoise:PhaseModulation (Types.types/Ray,Types.types/Intersection,System.Tuple`2<System.Tuple`3<double, Types.Algebra/Vector, double>[], double[]>) + 0x27e (0x402c0f70 0x402c1238) [0x273b080 - m"...
(gdb)
Where to specify, ShadingNoise:PhaseModulation is the function that I have defined as NextFunc in a simplified way. just in case, the original function it's here

Crash in GCDWebServer when app enters background

I'm getting a crash from GCDWebServer (3.3.3) when my app enters the background:
#3 0x000000010041ea80 in -[GCDWebServer dealloc] at project/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m:221
#4 0x00000001004248b8 in __destroy_helper_block_ ()
#5 0x000000018dd52a28 in _Block_release ()
#6 0x00000001020ad21c in _dispatch_client_callout ()
#7 0x00000001020b2284 in _dispatch_main_queue_callback_4CF ()
#8 0x000000018ee21f2c in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ ()
#9 0x000000018ee1fb18 in __CFRunLoopRun ()
#10 0x000000018ed4e048 in CFRunLoopRunSpecific ()
#11 0x00000001907d1198 in GSEventRunModal ()
#12 0x0000000194d28628 in -[UIApplication _run] ()
#13 0x0000000194d23360 in UIApplicationMain ()
#14 0x000000010009243c in main at project/main.m:10
#15 0x000000018dd305b8 in start ()
Enqueued from com.apple.main-thread (Thread 1)Queue : com.apple.main-thread (serial)
#0 0x00000001020b8ba4 in _dispatch_queue_push ()
#1 0x0000000100424680 in -[GCDWebServer _stop] at project/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m:734
#2 0x0000000100424a10 in -[GCDWebServer _didEnterBackground:] at project/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m:746
The specific line is:
GWS_DCHECK(_options == nil); // The server can never be dealloc'ed while running because of the retain-cycle with the dispatch source
It looks like the _options dictionary has to be nil (eg. the server has to be stopped) but it looks like the _options is never set to nil on this code path: it's set to nil in - stop but not in - _stop.
I'm probably missing something as this would have been noticed by other people.
I had the same problem. I solved it saving the server in a static variable on my class instead of saving in a function.
It doesn't works:
class Server {
static func initialize() {
let webServer = GCDWebServer()
...
webServer?.start(withPort: 8081, bonjourName: nil)
}
}
It's works:
class Server {
static let webServer = GCDWebServer()
static func initialize() {
...
webServer?.start(withPort: 8081, bonjourName: nil)
}
}

Unable to reload TableView Data in iOS App

I find my self out of ideas trying to get this app to work. My app uses a split view to show to lists. the "Master" list should hold a list of the user's Facebook friends. Since the app does not force you to login, if you're not logged in yet it shows "You have no friends" in the list till you've logged in. My problem is that once I've loaded all the friends and call [self.tableView reloadData] my program crashes some in there, and despite my best attempts at debugging it I can't find it. The method is
- (void)request:(FBRequest *)request didLoad:(id)result
{
if ([result isKindOfClass:[NSArray class]] && ([result count] > 0)) {
result = [result objectAtIndex:0];
}
switch (((Facebook *)[Facebook shared]).currentCall) {
case graphUserFriends:
{
_friends = [NSMutableArray array];
NSArray *resultData = [result objectForKey:#"data"];
if ([resultData count] > 0)
{
for (NSUInteger i=0; i<[resultData count] && i < 25; i++)
{
NSDictionary *friendDictionary = [resultData objectAtIndex:i];
FbFriend * f = [[[FbFriend alloc] initWithName:[friendDictionary objectForKey:#"name"] Id:[friendDictionary objectForKey:#"id"]] autorelease];
[_friends addObject:f];
}
}
[self.tableView reloadData];
break;
}
default:
break;
}
}
The whole source code (and Xcode 4 project) can be downloaded from https://skydrive.live.com/redir.aspx?cid=04b38cdd7b38bb7f&resid=4B38CDD7B38BB7F!798&parid=4B38CDD7B38BB7F!470&authkey=!API4iVva95nZFL8
Console (At Crash):
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug 15 16:03:10 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".sharedlibrary apply-load-rules all
Attaching to process 48870.
Catchpoint 3 (throw)Pending breakpoint 1 - "objc_exception_throw" resolved
Current language: auto; currently objective-c
(gdb) bt
#0 0x0156ecf0 in objc_exception_throw ()
#1 0x013c9674 in -[__NSArrayI objectAtIndex:] ()
#2 0x00454805 in -[UITableViewDataSource tableView:heightForRowAtIndexPath:] ()
#3 0x0026427a in -[UITableViewController tableView:heightForRowAtIndexPath:] ()
#4 0x0020f548 in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] ()
#5 0x00211722 in -[UITableViewRowData numberOfRows] ()
#6 0x000c17c7 in -[UITableView noteNumberOfRowsChanged] ()
#7 0x000c12c1 in -[UITableView reloadData] ()
#8 0x0000247e in -[MasterViewController request:didLoad:] (self=0x6a491e0, _cmd=0x12e65, request=0x681e930, result=0x6824250) at /Users/CheckM8/Documents/Xcode 4/Projects/iPeople4/iPeople4/MasterViewController.m:46
#9 0x00009d36 in -[FBRequest handleResponseData:] (self=0x681e930, _cmd=0x1397a, data=0x6a76c60) at /Users/CheckM8/Documents/Xcode 4/facebook-facebook-ios-sdk-74358cd/src/FBRequest.m:261
#10 0x0000a357 in -[FBRequest connectionDidFinishLoading:] (self=0x681e930, _cmd=0xade62e, connection=0x681ec40) at /Users/CheckM8/Documents/Xcode 4/facebook-facebook-ios-sdk-74358cd/src/FBRequest.m:346
#11 0x00a29a59 in ___NSURLConnectionDidFinishLoading_block_invoke_0 ()
#12 0x00a27e94 in __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0 ()
#13 0x00a28eb7 in -[NSURLConnectionInternalConnection invokeForDelegate:] ()
#14 0x00a27e4f in -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] ()
#15 0x00a27fd5 in -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] ()
#16 0x0096cf6a in _NSURLConnectionDidFinishLoading ()
#17 0x0398fbbd in URLConnectionClient::_clientDidFinishLoading ()
#18 0x03a5c5ea in URLConnectionClient::ClientConnectionEventQueue::processAllEventsAndConsumePayload ()
#19 0x03986298 in URLConnectionClient::processEvents ()
#20 0x03a5c16b in non-virtual thunk to URLConnectionInstanceData::multiplexerClientPerform() ()
#21 0x03986137 in MultiplexerSource::perform ()
#22 0x013b197f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#23 0x01314b73 in __CFRunLoopDoSources0 ()
#24 0x01314454 in __CFRunLoopRun ()
#25 0x01313db4 in CFRunLoopRunSpecific ()
#26 0x01313ccb in CFRunLoopRunInMode ()
#27 0x012c6879 in GSEventRunModal ()
#28 0x012c693e in GSEventRun ()
#29 0x00034a9b in UIApplicationMain ()
#30 0x00001d82 in main (argc=1, argv=0xbfffed64) at /Users/CheckM8/Documents/Xcode 4/Projects/iPeople4/iPeople4/main.m:16
#31 0x00001cf5 in start ()
You've made the classic memory management mistake: You're directly accessing your ivars and it burned you.
_friends = [NSMutableArray array];
This is an under-retain (which will crash later), and also a possible leak if _friends had a prior value. You should always use accessors for your ivars except in dealloc and init:
self.friends = [NSMutableArray array];
...
[self.friends addObject:f];
EDIT: From your stacktrace, your bug is in your table view data source's tableView:heightForRowAtIndexPath:. It looks like you're reading off the end of your array.

Resources