我遇到了crashlytics ndk stacktrace parcing的问题 . stacktrace中的所有或特定行都是“缺失” .

我模拟了设备上的崩溃(nullptr SIGSEGV),并在logcat中使用正确的函数名称获得了人类的frienly stacktrace . 在下一次会话中,crashlytics正确地发送了报告,但是在Fabric的仪表板中,我看到这次崩溃有“缺失”的行,尽管它在logcat中是正确的 .

当我上传符号时,正确崩溃解析的可能性会增加 . 但只适用于最后一次构建,而不适用于所有崩溃 . 这意味着crashlytics只存储所有应用程序版本的单个符号副本,因此旧版本将发送带有“缺失”行的堆栈跟踪 .

毕竟,我尝试研究在Android中捕获和解析崩溃的机制,并使用libunwind创建我的sigaction捕手 . 它给了我正确的堆栈跟踪,我把它放到了碰撞有效载荷( context->log() ) . 接下来,我将信号返回到crashlytics sigaction处理程序 . 最后,我在Fabric的报告中有"missing"行stacktrace,在我的有效负载中有有效的堆栈跟踪 . 有时这种方法会导致Android 8.0以下的操作系统崩溃,我认为这是因为我使用的是非安全信号功能,但它仍适用于android 8 .

我也创建了链接器映射文件 (-Xlinker -Map=output.map) ,但我无法将其与结构报告链接,而不是我自己的堆栈跟踪 .

所以,问题是:为什么在这种情况下,碰撞学堆栈跟踪中的行是“缺失”,而logcat和简单的sigaction捕获器提供了正确的堆栈跟踪?

Versions:

crashlytics 2.9.3

crashlytics-ndk 2.0.4

Code:

Fabric.with(context, new Crashlytics(), new CrashlyticsNdk());