gpt4 book ai didi

android - 如何在 Flutter 中表示 libapp.so 堆栈跟踪?

转载 作者:行者123 更新时间:2023-12-05 00:02:29 32 4
gpt4 key购买 nike

在 Google Play 控制台中,有时我会看到如下崩溃报告:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.blackoutage.game <<<

backtrace:
#00 pc 00000000003080f0 /data/app/~~X6gyE3SkREkb9PZZqeHzjA==/com.blackoutage.game-7OdYWe4UMLRMee8enANExA==/split_config.arm64_v8a.apk!lib/arm64-v8a/libflutter.so (offset 0xafa000)
#00 pc 0000000000306ad4 /data/app/~~X6gyE3SkREkb9PZZqeHzjA==/com.blackoutage.game-7OdYWe4UMLRMee8enANExA==/split_config.arm64_v8a.apk!lib/arm64-v8a/libflutter.so (offset 0xafa000)
#00 pc 000000000065ebc4 /data/app/~~X6gyE3SkREkb9PZZqeHzjA==/com.blackoutage.game-7OdYWe4UMLRMee8enANExA==/split_config.arm64_v8a.apk!lib/arm64-v8a/libflutter.so (offset 0xafa000)
#00 pc 000000000051e4a8 /data/app/~~X6gyE3SkREkb9PZZqeHzjA==/com.blackoutage.game-7OdYWe4UMLRMee8enANExA==/split_config.arm64_v8a.apk!lib/arm64-v8a/libapp.so (offset 0x1000)
#00 pc 0000000000565c9c /data/app/~~X6gyE3SkREkb9PZZqeHzjA==/com.blackoutage.game-7OdYWe4UMLRMee8enANExA==/split_config.arm64_v8a.apk!lib/arm64-v8a/libapp.so (offset 0x1000)
#00 pc 000000000063925c /data/app/~~X6gyE3SkREkb9PZZqeHzjA==/com.blackoutage.game-7OdYWe4UMLRMee8enANExA==/split_config.arm64_v8a.apk!lib/arm64-v8a/libflutter.so (offset 0xafa000)
#00 pc b4000071fdfd5200 <unknown>
libflutter.so 符号化堆栈跟踪非常容易( https://github.com/flutter/flutter/wiki/Crashes)。根据上面的日志,我可以说 flutter 中的某些东西崩溃了,但是要修复这些错误,我还需要符号化来自 libapp.so 的跟踪。 , 我怎样才能做到这一点?

最佳答案

首先,如果可以,请尝试使用集成解决方案,例如 Sentry (https://pub.dev/packages/sentry_flutter)。它会自动捕获堆栈跟踪并尝试对其进行符号化。如果您的应用程序被剥离,您还可以将符号文件上传到他们的服务器,它们将对其进行符号化。
其次,如果你想手动完成,这里有一些见解。我之前一直在为这种符号化而苦苦挣扎,而且互联网上似乎没有足够的信息(所以让我在互联网上添加一点信息;))。libapp.so ,有趣的是,是一个正常的 .so文件(动态链接库)。它不是一种特殊的自制特定于 Flutter 的格式。相反,即使您编写 C/C++ 程序并对其进行编译,它也是相同的 ELF 格式。有了这些知识,您将立即意识到,符号化 Flutter 堆栈跟踪与符号化普通 C/C++/... 代码没有区别。
因此,您可能需要对传统的 C/C++ 世界有所了解。例如,我建议阅读经典 CSAPP 教科书的“链接器”章节,它很好地解释了一切。那你就完全明白什么是.so文件,如何符号化 C/C++ .so 文件的堆栈跟踪等。
那么你做 Flutter 的符号化应该没有问题。但是在这里我也一步一步地写下要做什么:首先,当您构建apk而不包含其中的调试信息时,您使用split-debug-info标志并单独获取调试信息文件。符号化将需要此调试信息文件。然后,使用传统工具操作传统.so文件,例如 addr2line , 获取给定 pc 的源代码行号.当然,更高级的工具如 ndk-stack也可以提供帮助。或者您可以编写自己的脚本调用 addr2line等等。

关于android - 如何在 Flutter 中表示 libapp.so 堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69507469/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com