AndroidNDK使用addr2line符号化得到错误函数名的问题-创新互联

一般Android NDK出现崩溃之后,我们会使用addr2line工具来进行符号化。如果你使用了C++11的一些特性,那么要注意了,有可能你将得到错误的函数名。我们公司是提供崩溃分析相关的服务的,采集用户的崩溃日志,上传到后台服务器后,会进行符号化操作。之前一直好好的,最近有用户说符号化后的结果不正确,函数名和文件及行号不一致。

创新互联专注于建平企业网站建设,自适应网站建设,商城网站定制开发。建平网站建设公司,为建平等地区提供建站服务。全流程按需设计,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

        这个问题其实蛮奇怪的,要说addr2line可是操作系统级别的工具,无数人使用,不可能出这种低级错误啊。不过为了进一步验证,准备在自己的PC上用addr2line重现一下,结果发现,没有问题,符号化是正确的。又到服务器上测试,发现仍然不对。查看addr2line的版本,发现是不同的,如下所示。

[root@tdata ~]# addr2line --version
GNU addr2line version 2.20.51.0.2-5.42.el6 20100205
Copyright 2009 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.
xxx@xxx-desktop:~/Templates/Tyrion-debug-tusuo$ addr2line --version
GNU addr2line (GNU Binutils for Ubuntu) 2.24
Copyright 2013 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

看来应该是这个问题了,同时操作系统也不同,自己的是Ubuntu,服务器是CentOS。大家都知道,CentOS上的软件一般版本都比较老,而且repo源没有最新版本的更新,需要自己添加源。

        首先想是不是将自己PC上的addr2line放到服务器上,就可以解决问题了,因为这个文件是C语言写的二进制文件。结果出现了下面的错误:

[root@tdata ~]# ./addr2line -f -e libgame.so 0x33e17b
./addr2line: error while loading shared libraries: libbfd-2.24-system.so: cannot open shared object file: No such file or directory

查阅了addr2line的源码可以发现,它会引用#include "bfd.h",会依赖libbfdxxx.so。

        接着只能从官方下载新版本,再重新编译,进行addr2line的版本升级。官网地址为

ftp://sourceware.org/pub/binutils/snapshots/binutils-2.24.90.tar.bz2,你也可以从git上同步代码下来重新编译。

        注意最好到目标机器上进行编译。在升级了addr2line之后,一切正常了。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:AndroidNDK使用addr2line符号化得到错误函数名的问题-创新互联
路径分享:http://ybzwz.com/article/jiopi.html