Ошибка EXC_BAD_ACCESS KERN_INVALID_ADDRESS из Crashlytics - PullRequest
0 голосов
/ 14 мая 2018

Я должен выяснить, почему мое приложение падает.Проблема в том, что на моем устройстве (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 голосов
/ 14 мая 2018

Могу поспорить, что этот сбой связан с многопоточным доступом к SQLite. Смысл в том, что вы используете dispatch_get_global_queue, который отображается на несколько потоков, а также в потоке трассировок стека #3 И поток #6 также делают что-то связанное с DataBaseHandler / sqlite3_exec в то же время сбоя.

Вы не должны делать многопоточный SQLite, если вы действительно не уверены, что вам нужно это сделать.

Самый простой способ избежать ужасных вещей, которые трудно отладить и понять, - это просто использовать выделенную однопоточную (иначе называемую «последовательная») очередь для доступа к БД вместо использования dispatch_get_global_queue. См. Создание последовательных очередей отправки

Если вам действительно нужно несколько потоков , прочитайте это и проверьте, правильно ли ваш код его настраивает.

...