`
jxw3042
  • 浏览: 20157 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

【转载】使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈

 
阅读更多
使用arm-eabi-addr2line工具跟踪Android调用堆栈
作者:liangshengyang
转自:http://www.linuxidc.com/Linux/2011-01/31803.htm

在通常的C/C++代码中,可以通过响应对内存操作不当引起的Segmentation Fault错误即信号SIGSEGV(11)做出响应处理。只要在程序中设置SIGSEGV的handler中,调用libc的backtrace,打出对应的堆栈信息,很快就能找到问题所在。但在Android中,bionic并不提供类似功能,而且log信息是走的loger,通过logcat才可以看到。但是android也会输出log信息,象下面这样:

02-08 10:36:32.076: INFO/DEBUG(1261): pid: 1959, tid: 1959  >>> Android.radio <<<
02-08 10:36:32.076: INFO/DEBUG(1261): signal 11 (SIGSEGV), fault addr 00198080
02-08 10:36:32.076: INFO/DEBUG(1261):  r0 00198080  r1 81116dac  r2 ffffffea  r3 00000000
02-08 10:36:32.086: INFO/DEBUG(1261):  r4 8111a9f0  r5 0000000a  r6 00000888  r7 0000000a
02-08 10:36:32.086: INFO/DEBUG(1261):  r8 735f6d66  r9 525f6474  10 4104bcd8  fp 00000000
02-08 10:36:32.086: INFO/DEBUG(1261):  ip a0000000  sp bec1a300  lr 81112561  pc 81109124  cpsr 80010010
02-08 10:36:32.306: INFO/DEBUG(1261):          #00  pc 00009124  /system/lib/libfmradio_jni.so
02-08 10:36:32.306: INFO/DEBUG(1261):          #01  pc 0001255c  /system/lib/libfmradio_jni.so
02-08 10:36:32.306: INFO/DEBUG(1261):          #02  pc 0000c93e  /system/lib/libfmradio_jni.so
02-08 10:36:32.316: INFO/DEBUG(1261):          #03  pc 0000ae14  /system/lib/libfmradio_jni.so
02-08 10:36:32.316: INFO/DEBUG(1261):          #04  pc 00008a72  /system/lib/libfmradio_jni.so
02-08 10:36:32.316: INFO/DEBUG(1261):          #05  pc 00006c22  /system/lib/libfmradio_jni.so
02-08 10:36:32.326: INFO/DEBUG(1261):          #06  pc 00004d92  /system/lib/libfmradio_jni.so
02-08 10:36:32.326: INFO/DEBUG(1261):          #07  pc 0000e434  /system/lib/libdvm.so

通常编译Android代码时,出于size的考虑,剔除了符号信息。但我们可以使用编译时生成的二进制文件(转注:含有符号信息的文件,通常位于./out/target/product/[PROJECT]/symbols/system/lib/目录),获取其符号信息,从而得到调用堆栈:

$ ./prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-addr2line -f -e ./out/target/product/[PROJECT]/symbols/system/lib/libfmradio_jni.so 0000960c 000129ec 0000cdce 0000b2a4 00009496 00008258 000054f6
non_congruent
bionic/libc/arch-arm/bionic/memcpy.S:229
__sfvwrite
bionic/libc/stdio/fvwrite.c:151
__sprint
bionic/libc/stdio/vfprintf.c:71
printf
bionic/libc/stdio/printf.c:44
fm_std_Power
frameworks/base/fmradio/jni/http://www.cnblogs.com/http://www.cnblogs.com/external/.../fmradio/fmapi/fm_std_api.c:144
_Z11fm_SwitchOnv
frameworks/base/fmradio/jni/fm_functions.cpp:95
radio_SwitchOn
frameworks/base/fmradio/jni/native.cpp:41
yang@Ubuntu$ c++filt _Z11fm_SwitchOnv
fm_SwitchOn()


通过这种方式,即可得到调用堆栈信息,找出问题所在。




-------------------------------------------------------------------------------------------------------------------
方法二
-------------------------------------------------------------------------------------------------------------------
cat logcat_3.log | ndk-stack -sym ~/[SOURCE-DIR]/out/target/product/[PROJECT]/symbols/system/lib/


-------------------------------------------------------------------------------------------------------------------
方法三
-------------------------------------------------------------------------------------------------------------------
转自:http://www.cppblog.com/fwxjj/archive/2011/09/30/157242.aspx

google提供了一个python脚本,可以从 http://code.google.com/p/android-ndk-stacktrace-analyzer/ 下载这个python脚本,然后使用
adb logcat -d > logfile 导出 crash 的log,
使用 arm-eabi-objdump (位于build/prebuilt/linux-x86/arm-eabi-4.2.1/bin下面)把so或exe转换成汇编代码,如:
arm-eabi-objdump -S mylib.so > mylib.asm,
然后使用脚本
python parse_stack.py <asm-file> <logcat-file>
分享到:
评论

相关推荐

    arm-none-eabi-gcc工具集合 for MinGW

    《深入理解arm-none-eabi-gcc工具集合在MinGW环境中的应用》 在嵌入式系统开发领域,GCC(GNU Compiler Collection)是一个不可或缺的工具,它提供了编译、链接和其他必要的功能来创建软件。在MinGW(Minimalist ...

    arm-none-eabi-arm-2010-09-51-for-linux交叉工具链

    arm-none-eabi-arm-2010-09-51-for-linux是另一种交叉工具链,安装之后可以使用anm-none-eabi-gcc等命令。 #mkdir /usr/local/arm #cp /mnt/hgxxx/arm-none-eabi-arm-2010-09-51-for-linux.tar.bz2 / #tar xvfj arm...

    arm-eabi-4.6.tar.gz

    标题中的"arm-eabi-4.6.tar.gz"是一个针对ARM架构的交叉编译工具链的压缩文件,其中"arm-eabi"代表ARM的嵌入式应用二进制接口(Embedded Application Binary Interface),这是一种用于ARM处理器的标准,确保不同...

    gcc-arm-none-eabi-10-2020-q4-major-win32.zip

    在Windows环境下,通常下载的文件名为“gcc-arm-none-eabi-10-2020-q4-major-win32.zip”,解压后会得到一个可执行文件“gcc-arm-none-eabi-10-2020-q4-major-win32.exe”。双击运行,按照提示进行安装。安装完成后...

    gcc-arm-none-eabi-6-2017-q2-update-win32.exe

    标题中的"gcc-arm-none-eabi-6-2017-q2-update-win32.exe"是一个针对ARM架构的交叉编译工具链的Windows版本安装程序。这个工具链由GNU Compiler Collection (GCC)提供,用于在非嵌入式系统(如个人电脑)上构建和...

    gcc-arm-none-eabi-9-2020-q2-update-win32.zip

    }”代码,然后使用命令行工具链进行编译,如“arm-none-eabi-gcc -o main.elf main.c”。 总结,GCC for ARM None EABI是开发ARM架构嵌入式系统的重要工具,2020年第二季度的更新版本在性能、标准支持和错误处理等...

    gcc-arm-none-eabi-9-2020-q2-update.zip

    linux平台gcc编译器,gcc-arm-none-eabi-9-2020-q2-update-x64-linux.tar.bz2,gcc-arm-none-eabi-9-2020-q2-update-x64-linux.tar.bz2,只要5分,只要5分

    arm-linux-androideabi-4.9.zip

    《深入理解ARM-LINUX-ANDROIDEABI-4.9:构建NDK编译环境与CPU架构库》 在移动设备开发领域,Android NDK(Native Development Kit)扮演着至关重要的角色,它允许开发者使用C/C++编写底层代码,以实现高性能计算或...

    gcc-arm-none-eabi-5_4-2016q3-20160926-win32

    标题中的“gcc-arm-none-eabi-5_4-2016q3-20160926-win32”是指一个针对ARM架构、非嵌入式ABI(Application Binary Interface)的GCC(GNU Compiler Collection)编译器工具链。这个版本是2016年第三季度发布,具体...

    gcc-arm-none-eabi-10-2020-q4-major.zip

    标题中的"gcc-arm-none-eabi-10-2020-q4-major.zip"是一个用于嵌入式开发的工具包,特别针对ARM架构的微控制器。这个工具集包含了用于编译、链接和其他相关任务的工具,是开源软件GCC(GNU Compiler Collection)的...

    gcc-arm-none-eabi-10.3-2021.07-win32.zip

    `gcc-arm-none-eabi-10.3-2021.07-win32.zip`是GCC工具链的一个Windows版本,包含了2021年7月发布的10.3版。 一、GCC for ARM Cortex-M处理器 ARM Cortex-M系列处理器广泛应用于嵌入式系统,特别是物联网(IoT)...

    gcc-arm-none-eabi-8-2019-q3-update-win32.zip

    标题 "gcc-arm-none-eabi-8-2019-q3-update-win32.zip" 提供的信息表明,这是一个针对ARM微控制器的交叉编译工具链,由GNU Compiler Collection (GCC)提供,专为Windows 32位操作系统设计。这个工具链版本是8-2019-...

    gcc-arm-none-eabi-9-2020-q2-update-win32

    标题中的“gcc-arm-none-eabi-9-2020-q2-update-win32”指的是一个针对ARM架构的交叉编译工具链,该版本为2020年第二季度更新的Windows 32位版本。这个工具链是GCC(GNU Compiler Collection)的一个定制版本,专门...

    gcc-arm-none-eabi-7-2017-q4-major.zip

    标题中的"gcc-arm-none-eabi-7-2017-q4-major.zip"指示了这是一个2017年第四季度发布的GCC工具链的重大更新版本7。"major"表明这是一个重要的版本升级,可能包含性能优化、新特性或对标准库的改进。 在描述中提到的...

    gcc-arm-none-eabi编译器

    该工具是用在linux平台编译嵌入式arm平台代码的,可以编译简单的单片机程序,还可以编译uboot等,目前已经用了很久,编译器是arm-none-eabi的,以前用arm-linux编译总是用问题,换成这个版本的就好了,在此献上。

    arm-linux-androideabi-4.9.7z

    arm-linux-androideabi-4.9.7z正是这样一个关键的工具链,它为开发者提供了在Windows上构建适用于ARM架构(Android设备普遍使用的处理器架构)的Linux应用程序的能力。 一、交叉编译基础 交叉编译是指在一个平台上...

    gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2

    gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2,官网最新的,官网下载比较慢。

    gcc-arm-none-eabi-10.3-2021.10-win32.exe

    gcc-arm-none-eabi-10.3-2021.10-win32.exe

    gcc-arm-none-eabi-9-2019-q4-major-win32.zip

    标题中的"gcc-arm-none-eabi-9-2019-q4-major-win32.zip"是一个针对Windows操作系统的GCC交叉编译工具链压缩包。这个工具链是专门为ARM架构的微控制器和嵌入式系统设计的,使得开发者可以在运行Windows的个人电脑上...

    gcc-arm-none-eabi-4_9-2015q3-20150921-win32.zip

    `gcc-arm-none-eabi-4_9-2015q3-20150921-win32.zip` 是一个针对Windows操作系统的软件包,包含了GCC(GNU Compiler Collection)的一个特殊版本,专为在没有操作系统环境下的ARM处理器进行编译设计。GCC是GNU项目的...

Global site tag (gtag.js) - Google Analytics