Android NDK使用addr2line符号化得到错误函数名的问题

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

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

[[email protected] ~]# 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.
[email protected]:~/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语言写的二进制文件。结果出现了下面的错误:

[[email protected] ~]# ./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之后,一切正常了。

时间: 2024-08-17 23:11:03

Android NDK使用addr2line符号化得到错误函数名的问题的相关文章

深入理解Android NDK日志符号化

为了进行代码及产品保护,几乎所有的非开源App都会进行代码混淆,这样当收集到崩溃信息后,就需 要进行符号化来还原代码信息,以便开发者可以定位Bug.基于使用SDK和NDK的不同,Android的崩溃分为两类:Java崩溃和C/C++崩溃.Java崩溃通过mapping.txt文件进行符号化,比较简单直观,而C/C++崩溃的符号化则需要使用Google自带的一些NDK工具,比如ndk-stack.addr2line.objdump等.本文不去讨论如何使用这些工具,有兴趣的朋友可以参考同事写的另一篇

如何定位Android NDK开发中遇到的错误

做android应用的调试,最怕就是报错,crash,看到这篇好文章,记录一下: 转自:http://www.csdn.net/article/2014-12-30/2823366-Locate-Android-NDK Android NDK是什么? Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”.众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代

如何利用 release 版本的 backtrace 来定位 android NDK 程序的崩溃位置

我们知道 android NDK 程序在崩溃时会生成一个 tombstone 的 backtrace (也可利用 ADB logcat 抓取),从这个 backtrace 中我们可以了解是哪个函数引发的崩溃,但是通常由于我们发布时都是 release 版,无法利用 backtrace 中的地址信息直接定位到源码和行号,当引发崩溃的错误不是很明显时,对于我们解决问题的帮助就不大. 这时通常我们是重编一个 debug 版本并设法重现 crash.这样做有个两个问题,一是如果我们不知道复现步骤,或者复

Android NDK:Aborting..Stop的处理方法

在eclipse中配置cocos2d-x的android环境时,遇到这样的错误提示 网上搜索了一下,说是在NDK_MODULE_PATH环境变量下未找到所需要的Android.mk文件,后来仔细研究了一下项目属性,找到环境设置这一项 添加完NDK_MODULE_PATH路径之后,会在项目的.settings目录下生成一个名为org.eclipse.cdt.core.prefs的文件 之后将project clean && build就好了     注意事项: 添加NDK_MODULE_PA

Android NDK开发指南---Application.mk文件和android.mk文件

https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https://android.googlesource.com/platform/ndk/+/4e159d95ebf23b5f72bb707b0cb1518ef96b3d03/docs/ANDROID-MK.TXT https://android.googlesource.com/platform/ndk/+/4

Android NDK环境搭建与简单实例

一.NDK与JNI简介 NDK全称为native development kit本地语言(C&C++)开发包.而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发). 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用.NDK开发的可以称之为底层开发或者jni(java  native interface)层开发,SDK开发可以称为上层开发. Andr

Android NDK编写一个HelloWorld

在上一篇博文中,我们搭建好了Android ndk 的开发环境,作为码农,我们是不是先来写一个HelloWorld来表示一下自己的到来. (1)首先在你的工作空间建一个Android项目,这里我建立的为NDKHelloWorld.项目结构如图(1) . 图(1) (2)在MainActivity中声明你所需要的本地方法,MainActivity的代码如下所示: package com.gc.ndkhelloworld; import android.app.Activity; import an

【转】Android NDK学习(2)Windows下NDK开发环境配置

一.配置好Android开发环境 现在android SDK的版本已经到了4.4了,几乎不用配置,下载下来解压,SDK跟Android开发专用Eclipse都有了.喜欢. 二.下载安装安卓NDK 下载最新版,解压即可. 2013年6月7日: 目前版本已经到了r8e. 三.下载安装cygwin   由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从uni

Android NDK R9环境配置,开发教程

最近,在学习android ndk开发,配置环境的时候遇到了些问题,总算不负有心人--在这里记录哈过程,与筒子们分享哈--想学NDK的筒子们有福啦-- 教程本人亲测,非copy的-- 如有什么不明白的地方,可以留言 大神也可以进来瞧瞧有什么不对的地方,请指教两招 ----------------------------------------------------------------------------------------------------------------------