来自Crashlytics

时间:2018-05-14 07:43:00

标签: ios objective-c xcode crashlytics

我必须弄清楚为什么我的应用程序崩溃了。问题是在我的设备(iPhone 5s)上工作正常,但是我收到了iPhone 8 Plus的崩溃报告,这对我没有意义。

根据Crashlytics信息,当用户对调用数据库以检索某些数据的函数进行分类时会发生错误。

- (NSArray*)getContent:(NSString*)ID{


    NSMutableArray *retval = [[NSMutableArray alloc] init];

    NSString *query = [NSString stringWithFormat:@"SELECT * from contents where ID = \"%@\"",ID];

    const char* queryUTF8 = [query UTF8String];
    sqlite3_stmt *statement;

    @autoreleasepool {
        int response = sqlite3_prepare_v2(_database, queryUTF8, -1, &statement, nil);
        if (response == SQLITE_OK) {

Crashlytics报告错误出现在这一行:

if (response == SQLITE_OK) {

它还提到这个方法是从另一个类调用的,具体来说是:

__43-[SessionManager calculateAllItemDistances]_block_invoke

SessionManager是类,calculateAllItemDistances是方法,这是对getContent方法的调用:

NSArray *contentData = [[self dataManager] getContent:"33"];

此代码在里面:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

我知道如何解决这个问题?

更新 崩溃报告:https://pastebin.com/FsgC9fq8

1 个答案:

答案 0 :(得分:2)

我敢打赌,这次崩溃与SQLite的多线程访问有关。这样做的原因是你正在使用dispatch_get_global_queue,它映射到多个线程,并且在你的堆栈跟踪中,线程#3和线程#6也在做与DataBaseHandler / sqlite3_exec相关的事情。崩溃的同一时间。

除非你确定需要这样做,否则你不应该做多线程SQLite。

避免难以调试和理解的可怕事情的最简单修复方法是使用专用的单线程(也称为#34; serial")队列来访问数据库,而不是使用dispatch_get_global_queue。见Creating Serial Dispatch Queues

如果你真的需要多个线程read this并检查你的代码是否配置正确。