【问题标题】:How to symbolicate libapp.so stack trace in Flutter?如何在 Flutter 中表示 libapp.so 堆栈跟踪?
【发布时间】:2021-10-09 14:08:40
【问题描述】:

在 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的痕迹,我该怎么做?

【问题讨论】:

    标签: android flutter ndk-stack


    【解决方案1】:

    首先,如果可以,请尝试使用集成解决方案,例如 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等等。

    【讨论】:

    • @raver 如果对您有帮助,请接受答案,或者指出答案不起作用的地方。
    • 感谢您的帮助。我使用不同的方法解决了我的问题(我在 iOS 上遇到了同样的崩溃,所以我可以在那里轻松地读取堆栈跟踪)。
    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多