Мы столкнулись с проблемой сбоев iOS в нашей единственной библиотеке SDK, написанной на target-c.Эта библиотека target-c вызывается из приложения swift, разработанного нашим заказчиком.
Ниже приведен фрагмент кода из нашего sdk, где мы создаем несколько потоков: -
//Create a queue to collect attributes in parallel
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
//Create group to wait on the task scheduled in global queue
dispatch_group_t group = dispatch_group_create();
// Collect all information1
dispatch_group_async(group, queue, ^{
info1 = [self getInformation1];
});
// Collect all information2
dispatch_group_async(group, queue, ^{
info2 = [self getInformation2];
});
// Collect all information3
dispatch_group_async(group, queue, ^{
info3 = [self getInformation3];
});
// Collect all information4
dispatch_group_async(group, queue, ^{
info4 = [self getInformation4];
});
// Collect all information5
dispatch_group_async(group, queue, ^{
info5 = [self getInformation5];
});
// wait on the group to block the current thread.
int64_t time_delay = 3.0;
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, time_delay * NSEC_PER_SEC);
long success = dispatch_group_wait(group,timeout);
if(success != 0) {
//Log data to check which bucket is not complete
[Logger writeLogWithSeverity:kLogERROR message:info1];
[Logger writeLogWithSeverity:kLogERROR message:info2];
[Logger writeLogWithSeverity:kLogERROR message:info3];
[Logger writeLogWithSeverity:kLogERROR message:info4];
[Logger writeLogWithSeverity:kLogERROR message:info5];
}
Этоэто идеальный способ или есть ли лучший способ для создания параллельных потоков?
Ниже приведено несколько трасс стеков сбоев
1)
Тип исключения: EXC_BAD_ACCESS (SIGBUS)Коды исключений: 0x00000000 в 0x0000000323f7bec8 Сбой потока: 0
Поток 0 Crashed: 0 libobjc.A.dylib 0x000000018193c1a0 0x181918000 + 147872 (objc_retain + 16) 0 устройств 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 0 0 5 5 5 5 5 5 5 6 5 6 6 5 6 8 6 6 6 8 8 0 0 0 5 5 5 0 5 5 5 5 5 5 5 5 5 5 6 10 5 ЗОБ.м: 215 + 28) 2 abcMobile 0x0000000104365b78 0x1041c8000 + 1694584 - [DeviceInventory startCollectingdeviceInfo] (DeviceInventory.m: 206 + 0) 3 libdispatch.dylib 0x0000000182058b24 0x182057000 + 6948 (+ 24) 4 libdispatch.dylib 0x0000000182058ae4 0x182057000 + 6884 (+ 16)5 libdispatch.dylib 0x00000001820656e0 0x182057000 + 59104 (+ 1012) 6 CoreFoundation 0x000000018270f070 0x182621000 + 974960 (+ 12) 7 CoreFoundation 0x000000018270cbc8 0x182621000 + 965576 (+ 2272) 8 CoreFoundation 0x000000018262cda8 0x182621000 + 48552 (CFRunLoopRunSpecific + 552) 9 GraphicsServices 0x000000018460f020 0x184604000 + 45088 (GSEventRunModal + 100)10 UIKit 0x000000018c60d78c 0x18c2f0000 + 3266444 (UIApplicationMain + 236) 11 abcMobile 0x00000001041ccc40 0x1041c8000 + 19520 основной (main.self.delegate didCompletedCollectingInformation: deviceInfo];
didCompletedCollectingInformation является функцией обратного вызова
2)
Тип исключения: EXC_BAD_ACCESS (SIGBUS) Коды исключений: 0x0000000000000000000000000000: 18
Тема 18 Сбой: 0 libobjc.A.dylib 0x0000000182f3c1a0 0x182f18000 + 147872 (objc_retain + 16) 1 abcMobile 0x0000000100c0150c 0x100a64000 + 1692940 - [DeviceInventory didFailWithError:] (DeviceInventory.m: 144 + 28) 2 CoreFoundation 0x0000000183cf8c3c 0x183c21000 + 883772 (+ 20) 3 CoreFoundation 0x0000000183cf81b8 0x183c0 + 2 0403 0803 0803 0803 0803 (0803) 0803 (0803) 0803 (0803) 0403 (факс-код) + 0403 0803 (0803) 0403 (0403) 0403 (факс-код) + 0403 (факс-код) + 0403 (факс.0x0000000183d7584c 0x183c21000 + 1394764 (+ 1408) 6 CoreFoundation 0x0000000183c2ef38 0x183c21000 + 57144 (_CFXNotificationPost + 384) 7 Фонд 0x000000018469fbbc 0x184699000 + 27580 (+ 68) 8 abcMobile 0x0000000100bf7f80 0x100a64000 + 1654656 + [Ошибки sendErrorNotifactionForErrorCode:] (Errors.m: 405 + 64)9 abcMobile 0x0000000100bf101c 0x100a64000 + 1626140 + [информация NetworkInfo1] (NetworkInfo.m: 711 + 0) 10 abcMobile 0x0000000100bfb9fc 0x100a64000 + 1669628 - [информация об услугах 1] (Services.m: 391 + 20) 0 000 0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 все еще 0] (DeviceInventory.m: 635 + 56) 12 abcMobile 0x0000000100c0268c 0x100a64000 + 1697420 __39- [DeviceInventory getdeviceInfo] _block_invoke.163 (DeviceInventory.m: 256 + 16) 13 libdispatch.dylib 0x0000000183658aa0 0x183657000 + 6816 (+ 24) 14 libdispatch.dylib 0x0000000183658a60 0x183657000 + 6752 (+ 16) 15 libdispatch.dylib 0x000000018369a5f0 0x183657000 + 275952 (+ тысяча сто сорок восемь)16 libdispatch.dylib 0x000000018369a110 0x183657000 + 274704 (+ 112) 17 libsystem_pthread.dylib 0x000000018398bfac 0x18398b000 + 4012 (_pthread_wqthread + 1176)
ответ на запрос в суде)
Здесь didFailWithError является функцией обратного вызова
Мы не можем найти основную причину этого сбоя, поскольку это очень случайная проблема.У кого-нибудь есть идеи, как исправить эту проблему сбоев?Любые указатели будут очень полезны, поскольку мы поражены этим вопросом.