android - 如何符号化剥离的共享库的堆栈跟踪

标签 android c++ android-ndk linker shared-libraries

我有一份来自 Google Play 服务的应用程序崩溃报告,如下所示:

backtrace:
  #00  pc 00000000001b46a0  library.so
  #01  pc 0000000000604464  library.so
  #02  pc 0000000000c8ed1c  library.so

我还有一个用于 library.so.map 文件,它可以帮助我找到函数名称并将堆栈跟踪转换为更易读的格式:

backtrace:
  #00  pc 00000000001b46a0  library.so  foo()
  #01  pc 0000000000604464  library.so  bar()
  #02  pc 0000000000c8ed1c  library.so  zoo()

但是手动解析函数名称很容易出错,它没有给我行号是导致崩溃的源代码。

我考虑过在发布新版本时存储 library.so 的未剥离版本的想法,这样我就可以使用 ndk-stack工具,但剥离和未剥离二进制文件的 AFAIK 函数地址不同。

所以我的问题是可以继续发布剥离的二进制文件并有办法自动用行号符号化堆栈跟踪吗?

任何建议将不胜感激

最佳答案

ndk-stack 正是为此目的而构建的,不用担心。您将未剥离的 library.so 提供给它,并获得您可以实现的最佳堆栈跟踪!

确保您不混合调试/发布版本,并为每个进入生产的二进制文件保留未剥离版本(或确保您可以为相应的 git 标签可靠地重建此类未剥离版本)。

关于android - 如何符号化剥离的共享库的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52695965/

相关文章:

java - Android RecyclerView 滚动性能

c++ - 将自定义元数据添加到 jpeg 文件

android - "Unknown Application ABI:"而 'debug as native application'

android - 如何防止 NDK 将堆栈跟踪转储到 android logcat?

Android设置线程亲和性

android - 如何在Android中的TextLayoutInput中的EditText下显示错误消息?

android - NavigationView 将所选项目设置为已选中

android - 系统跟踪|应用程序线程上没有 "performTraversals"或没有应用程序线程

c++ - std::ostream_iterator 未找到运算符<<

c++ - 相当于 DirectX 渲染状态的 OpenGL