来自 Crashlytics 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 错误崩溃

Posted

技术标签:

【中文标题】来自 Crashlytics 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 错误崩溃【英文标题】:EXC_BAD_ACCESS KERN_INVALID_ADDRESS error crash from Crashlytics 【发布时间】:2018-05-14 07:42:59 【问题描述】:

我必须弄清楚我的应用崩溃的原因。问题是在我的设备 (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

【问题讨论】:

请发布完整的 Crashlytics 堆栈跟踪报告和错误消息。可能会使用 pastebin.com @battlmonstr 更新 【参考方案1】:

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

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

避免难以调试和理解的可怕事情的最简单解决方法是仅使用专用的单线程(也称为“串行”)队列来访问数据库,而不是使用 dispatch_get_global_queue。见Creating Serial Dispatch Queues

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

【讨论】:

如果是这样,为什么它只在某些设备上崩溃?也许是因为它们速度更快,并且对数据库的调用同时发生? 也许吧。竞争条件崩溃通常是随机的。 en.wikipedia.org/wiki/Race_condition#Software

以上是关于来自 Crashlytics 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 错误崩溃的主要内容,如果未能解决你的问题,请参考以下文章

来自 Crashlytics 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 错误崩溃

Crashlytics错误:架构arm64的未定义符号

从 Crashlytics 升级到 Fabric 后无法构建我的应用

Crashlytics 不显示本机崩溃

架构 armv7 的未定义符号:“_OBJC_CLASS_$_Crashlytics”,引用自:AppDelegate.o 中的 objc-class-ref

如何在运行时禁用 Crashlytics for iOS?