Я использую sigaction()
для установки обработчика сбоев в моем приложении и печати информации о частной версии.
В случае сбоя assert()
сообщение об отмене очень полезно, и я хотел бы, чтобы я подписалсяобработчик, чтобы распечатать его.Как я могу получить эту строку?Ниже приведен некоторый анализ, который я провел до сих пор:
Я заметил в ndk debuggerd / tombstone.c engrave_tombstone()
, что есть аргумент uintptr_t abort_msg_address
, который содержит сообщение о прерывании, обычнонесостоявшееся утверждение.Но понятия не имею, откуда это взято.Заметив, что стандартные журналы сбоев Android, кажется, работают в другом процессе, и отладчик d подразумевает, что это демон, я не уверен, что это правильный путь.
Более того, я вижу вbionic libc / stdlib / assert.c есть только вызов __libc_android_log_print(ANDROID_LOG_FATAL, ...)
.Также не очень полезно.Но в bionic linker_main.cpp есть abort_msg_t* g_abort_message = nullptr;
и другие интересные вещи в android_set_abort_message.cpp .Опять же, я не уверен, что это правильный путь, кажется очень хакерским.
Это то, что по умолчанию обрабатывает обработчик сбоев андроида.Обратите внимание, как первое сообщение входит в аварийный pid / tid, но остальные представляют собой какой-то другой случайный процесс (предположительно, debuggerd?).
10-09 16:49:28.551 12084 12127 F libc : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 12127 (applyRouting), pid 12084 (com.android.nfc)
10-09 16:49:28.691 12203 12203 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
10-09 16:49:28.692 12203 12203 F DEBUG : Build fingerprint: 'Android/aosp_marlin/marlin:Q/OC-MR1/summit07191458:userdebug/test-keys'
10-09 16:49:28.692 12203 12203 F DEBUG : Revision: '0'
10-09 16:49:28.692 12203 12203 F DEBUG : ABI: 'arm64'
10-09 16:49:28.692 12203 12203 F DEBUG : pid: 12084, tid: 12127, name: applyRouting >>> com.android.nfc <<<
10-09 16:49:28.692 12203 12203 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
10-09 16:49:28.692 12203 12203 F DEBUG : Abort message: 'jni_internal.cc:622] JNI FatalError called: applyRouting'
10-09 16:49:28.692 12203 12203 F DEBUG : x0 0000000000000000 x1 0000000000002f5f x2 0000000000000006 x3 0000000000000008