基督復活(復活節快樂)!
在小應用程序重構後測試應用程序時,我收到了「Crashlytics」崩潰日誌。 正在嘗試更改模型以通過將所有下一個調用(從第二個調用開始)發送到專用串行隊列來避免雙重同步方法調用(同時)。我已添加以下代碼:如何找出在IOS設備上導致錯誤崩潰報告的原因?
@interface SynchronizationModel()
@property (nonatomic) dispatch_queue_t synchronizationQueue;
@end
@implementation SynchronizationModel
BOOL isSynchronizationNotCalled = YES;
#pragma mark - Synchronization
+ (dispatch_queue_t)synchronizationQueue {
static dispatch_queue_t queue;
static dispatch_once_t onceToken;
const char *queueID = "com.app.synchronizationModel.queue";
dispatch_once(&onceToken, ^{
queue = dispatch_queue_create(queueID, DISPATCH_QUEUE_SERIAL);
});
return queue;
}
+ (void)sychronizeOfflineObjects {
if (isSynchronizationNotCalled) {
NSLog(@"%d synchronization without a queue, flag notCalled =", isSynchronizationNotCalled);
isSynchronizationNotCalled = NO;
[self synchronizeOfflineObjectsNonAsynchronous];
} else {
NSLog(@"%d synchronization inside of a queue, flag notCalled =", isSynchronizationNotCalled);
isSynchronizationNotCalled = NO;
__weak typeof(self)weakSelf = self;
dispatch_async(self.synchronizationQueue, ^{
__strong typeof(weakSelf)strongSelf = weakSelf;
[strongSelf synchronizeOfflineObjectsNonAsynchronous];
});
}
// [self sychronizeOfflineObjects]; - uncomment for recursive test
isSynchronizationNotCalled = YES;
}
如您所見,使用遞歸調用它進行測試。它確實有效。但有機會嘗試在設備上親自運行應用程序。
在少數地方調用此方法。主要在一個明顯的控制器:
- (IBAction)buttonWasTapped:(id)sender {
if(self.buttonImage.layer.animationKeys.count == 0){
[self synchronizationMethod];
}
}
- (void)synchronizationMethod {
NSLog(@"startWorkWithServer - originally here is some code but it works perfect");
[SynchronzationModel sychronizeOfflineObjects];
} else {
[self startAnimation];
[self performSelector:@selector(delayStop) withObject:nil afterDelay:2.0];
if([webConnectionAllowed isEqualToString:@"NotAllowed"]){
[self showAlertWithTitle:nil message:NSLocalizedString(@"Connection is allowed", nil)];
}
}
}
已將應用程序發送到我的團隊負責人結帳。 他已經在設備上啓動了一個應用程序,但是在一瞬間(猜測它已經工作了一段時間),它以SIGABRT錯誤消息拒絕。
Crashlytics報告返回:
#0. Crashed: com.twitter.crashlytics.ios.exception
0 App 0x18751d CLSProcessRecordAllThreads + 820509
1 App 0x18751d CLSProcessRecordAllThreads + 820509
2 App 0x187415 CLSProcessRecordAllThreads + 820245
3 App 0x17b34f CLSHandler + 770895
4 App 0x185dfb __CLSExceptionRecord_block_invoke + 814587
5 libdispatch.dylib 0x1c942083 _dispatch_client_callout + 22
6 libdispatch.dylib 0x1c94e33b _dispatch_barrier_sync_f_invoke + 50
7 App 0x1857fd CLSExceptionRecord + 813053
8 App 0x185625 CLSExceptionRecordNSException + 812581
9 App 0x18513b CLSTerminateHandler() + 811323
10 libc++abi.dylib 0x1c4f393f std::__terminate(void (*)()) + 78
11 libc++abi.dylib 0x1c4f3443 __cxa_rethrow + 90
12 libobjc.A.dylib 0x1c4ff1bb objc_exception_rethrow + 42
13 CoreFoundation 0x1d1a55a1 CFRunLoopRunSpecific + 596
14 CoreFoundation 0x1d1a5341 CFRunLoopRunInMode + 104
15 GraphicsServices 0x1e97cbfd GSEventRunModal + 156
16 UIKit 0x223b3e27 -[UIApplication _run] + 574
17 UIKit 0x223ae551 UIApplicationMain + 150
18 App 0x148daf main (main.m:14)
19 libdispatch.dylib 0x1c96f50b (Missing)
但因爲至少我沒有的dSYM文件(從Crashlytics僅.txt)的可以去看我來symbolicate崩潰日誌或瞭解是什麼原因導致沒有明顯的方式問題。要在我的設備上測試它,但不確定它是否會崩潰。
它看起來有什麼事發生與線程,但我不知道到底是什麼線索。有人可以建議如何找出造成問題的地方嗎?
還有一個補充:有一些人在一個項目上工作(我對它很陌生),我甚至不確定上面的代碼是否已經打開了錯誤(但很可能)或者它甚至在我發生變化之前。我剛剛找到一個小方法,第一次正常調用方法,並將所有其餘的調用發送到專用串行隊列。由於它遞歸地工作,這是非常小的變化,並且只使用一個額外的專用串行隊列,所以它讓我困惑,似乎對於真正的崩潰(與報告中的線程問題)有點太小。
將不勝感激任何意見。
您還沒有提供過的定義:'synchronizeOfflineObjectsNonAsynchronous' – Brandon
是的,猜測這個模型在我做了更改之前工作正常,所以我只添加了自己創建的代碼。而且這也會讓這個帖子變得更大。但如果你認爲它可以澄清這種情況,我可以添加更多的代碼? – Alexander
+(void)synchronizeOfflineObjectsNonAsynchronous {[self changeUser];如果([AppGroups allObjects] .count == 0){[[OfflineChangesModel sharedInstance] finish];返回; } if(!mainGroupId){[self synchronizationForNoMainGroupID]; } else {[self synchronizationForMainGroupID]; }}。如果需要的話,我可以爲synchronizationForNoMainGroupID和synchronizationForMainGroupID添加更多的代碼,但是在我對上面所做的更改進行修改之前,它一直運行良好。 – Alexander