来自 Crashlytics 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 错误崩溃

Stu*_*ent 0 xcode objective-c ios 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) {
Run Code Online (Sandbox Code Playgroud)

Crashlytics 报告错误在这一行:

if (response == SQLITE_OK) {
Run Code Online (Sandbox Code Playgroud)

它还提到这个方法是从另一个类调用的,特别是:

__43-[SessionManager calculateAllItemDistances]_block_invoke
Run Code Online (Sandbox Code Playgroud)

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

NSArray *contentData = [[self dataManager] getContent:"33"];
Run Code Online (Sandbox Code Playgroud)

这段代码在里面:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
Run Code Online (Sandbox Code Playgroud)

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

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

bat*_*str 5

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

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

避免难以调试和理解的可怕事情的最简单解决方法是仅使用专用的单线程(又名“串行”)队列来访问数据库,而不是使用 dispatch_get_global_queue。请参阅创建串行调度队列

如果您真的需要多个线程,请阅读本文并检查您的代码是否正确配置。