Проверка не удалась: получатель! = Nullptr virtual (SIGABRT) при записи в локальное хранилище - PullRequest
0 голосов
/ 09 марта 2020

У меня есть метод

   fun generateIdentity(deviceId:String, environment: String) {

     val identity= Identity()

     identity.deviceId = deviceId
     identity.environment = environment

    AppLog.i(TAG, "generateIdentity()")

    if (!configDirectory.exists()) {
        configDirectory.mkdirs()
    }

    val identityFile = File("$configDirectory/identity.json")

    if (identityFile.exists()) {
        identityFile.delete()
    }

    identityFile.createNewFile()

    val jsonIdentity = GsonBuilder().setPrettyPrinting().create().toJson(identity)

    try {
        val buf = BufferedWriter(FileWriter(identityFile, true))
        buf.append(jsonIdentity)
        buf.newLine()
        buf.close()
    } catch (e: IOException) {
        AppLog.e(TAG, e.printStackTrace().toString())
    }
}

, который записывает сериализованный объект

 class Identity{

@Expose
@SerializedName("device-id")
var deviceId: String = ""

@Expose
@SerializedName("environment")
var environment: String =""
}

в локальное хранилище в виде файла JSON.

Когда .to Json () вызывается для объекта идентификации в процессе построения Gson, в собственном слое возникает cra sh, который предоставляет очень длинный список журналов, начинающийся с

03-09 14:20:08.416 7468-7468/ A/art: art/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc:801] Check failed: receiver != nullptr virtual 

и заканчивающийся

03-09 14:20:08.799 7468-7468/? A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 7468 ()

Надгробие не создано. Это, казалось бы, тривиальный фрагмент кода, который работал в прошлом, не зная, какие изменения привели к тому, что это начало происходить. Как мне выяснить, что вызывает это?

1 Ответ

0 голосов
/ 10 марта 2020

Я помещаю весь процесс сериализации и записи файла в сопрограмму, как это:

val jsonCoversionResult: Deferred<String> = GlobalScope.async {
         GsonBuilder()
             .setPrettyPrinting()
             .create()
             .toJson(
                 identity)
     }

     runBlocking {
         val jsonIdentity = jsonCoversionResult.await()

         try {
             val buf = BufferedWriter(FileWriter(identityFile, true))
             buf.append(jsonIdentity)
             buf.newLine()
             buf.close()
         } catch (e: IOException) {
             AppLog.e(TAG, e.printStackTrace().toString())
         }
     }

Я пишу для версии AOSP с проприетарным оборудованием, и управление памятью иногда становится забавным по причинам, которые я не делаю не понимаю, но это сработало.

...