如何在 Crashlytics Android NDK 中符号化 libart.so 或 libc.so 堆栈跟踪?

问题描述 投票:0回答:2

注意:符号 are 显示在我们的 c++ 库的 crashlytics 中,问题是它们没有显示在

libc
libart
libbase
libandroid_runtime
等系统库中。

我们有一些棘手的崩溃完全发生在 Android 运行时中,如果没有符号,这些崩溃很难调试。在 firebase crashlytics 中,我们看到以下堆栈跟踪:

Crashed: Thread :  SIGABRT  0x0000000000000000
#00 pc 0x4e574 libc.so 
#01 pc 0x4e540 libc.so 
#02 pc 0x5677d8 libart.so 
#03 pc 0x13ab0 libbase.so 
#04 pc 0x13090 libbase.so 
#05 pc 0x38cb6c libart.so 
#06 pc 0x39f7d8 libart.so 
#07 pc 0x1260e0 libandroid_runtime.so 
#08 pc 0x124ef4 libandroid_runtime.so 
#09 pc 0x124dc4 libandroid_runtime.so 
#10 pc 0x115468 libandroid_runtime.so 

当我通过取消引用空指针在 C++ 库中强制测试崩溃时,我在本地 Android Studio 控制台中看到以下回溯:

...snip...
      #06 pc 00000000002d7644  /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: adb75d6f792faa24b1bc8cf512fb112c)
      #07 pc 00000000002cdd64  /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: adb75d6f792faa24b1bc8cf512fb112c)
      #08 pc 00000000002f23d0  /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+312) (BuildId: adb75d6f792faa24b1bc8cf512fb112c)
      #09 pc 00000000003839f4  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+800) (BuildId: adb75d6f792faa24b1bc8cf512fb112c)
      #10 pc 00000000003813f4  /apex/com.android.art/lib64/libart.so (MterpInvokeVirtualRange+1368) (BuildId: adb75d6f792faa24b1bc8cf512fb112c)
      #11 pc 00000000002c8714  /apex/com.android.art/lib64/libart.so (mterp_op_invoke_virtual_range+20) (BuildId: adb75d6f792faa24b1bc8cf512fb112c)
...snip...

但是,crashlytics 中的相同崩溃看起来像这样:

...snip...
#07 pc 0x222244 libart.so 
#08 pc 0x218964 libart.so 
#09 pc 0x284208 libart.so 
#10 pc 0x3e34ac libart.so 
#11 pc 0x800ba4 libart.so 
...snip...

我们如何让 crashlytics 包含故障转储中明确的信息?

关于我们构建设置的一些注意事项:

            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY")
            }
android c++ android-ndk crashlytics bionic
2个回答
1
投票

此行为是预期的。当 Crashlytics 发生 NDK 崩溃时,需要对这些崩溃进行符号化。为此,应将相应的符号文件上传到 Crashlytics。

通过您提到的配置,应用程序中可用的符号将上传到 Crashlytics。

nativeSymbolUploadEnabled true

但是对于系统库,相应的符号文件不可用(据我所知,它们不是公开的)。因此,Crashlytics 将无法访问系统库中对框架进行符号化所需的符号文件。


0
投票

也许你可以在 Google Play Console 中找到相应的堆栈。虽然无法匹配,但是系统库的符号是有的。

© www.soinside.com 2019 - 2024. All rights reserved.