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

Ale*_*nov 1 c++ linker android shared-libraries android-ndk

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

backtrace:
  #00  pc 00000000001b46a0  library.so
  #01  pc 0000000000604464  library.so
  #02  pc 0000000000c8ed1c  library.so
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

任何建议将不胜感激

Ale*_*ohn 6

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

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