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

时间:2018-10-08 05:37:39

标签: 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

我还有一个.map的{​​{1}}文件,它可以帮助我找到函数名并将stacktrace转换为更易读的格式:

library.so

但是,手动解析函数名容易出错,并且不会给我行号是导致崩溃的源代码。

我已经考虑过在发布新版本时存储未剥离版本backtrace: #00 pc 00000000001b46a0 library.so foo() #01 pc 0000000000604464 library.so bar() #02 pc 0000000000c8ed1c library.so zoo() 的想法,以便可以使用ndk-stack工具,但是剥离和未剥离二进制文件的AFAIK函数地址是不同的。

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

任何建议将不胜感激

1 个答案:

答案 0 :(得分:6)

ndk-stack正是为此目的而构建的,请放心。您将未剥离的 library.so 喂入其中,并获得可以实现的最佳堆栈跟踪!

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