- 浏览: 20175 次
- 性别:
- 来自: 深圳
最新评论
使用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>
作者: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>
发表评论
-
获取Root之后
2017-03-28 17:24 570ApplicationInfo info ... -
android apk 一键加壳
2016-12-02 15:20 17851, 下载源码 https://github.com/Jian ... -
NDK 学习笔记
2016-07-07 11:13 3471,创建jni的java类自动生成jni头文件 a)新建Jni ... -
源码编译Apk时,是否生成odex方法
2016-06-15 11:09 10131,其实Android系统默认的配置是,如果没有指定DISAB ... -
分享代码到jCenter
2016-05-26 16:58 5561, 新建正常的一个library 2, 在library工程 ... -
分享代码到jCenter
2016-05-26 16:59 01, 新建正常的一个library 2, 在library工程 ... -
Android6.0编译过程
2016-05-25 13:36 4051, 购买vpn账号 2, 选择ubuntu版本, 编译6.0 ... -
Apk资源文件混淆[微信开源方法]
2016-03-03 11:18 18451,微信压缩方法_01: 1)生成好了的demo.apk; ... -
反编译步骤
2016-03-03 10:35 5541, 反编译命令: apktool.bat d /locat ... -
AS gradle
2016-03-02 11:09 11891,Eclipse项目直接导程Android Studio项目 ... -
Android Google 开源项目路径
2015-06-19 09:11 424Android Google 开源项目路径 : [需要翻!墙] ... -
Android Studio 配置 SVN
2015-06-18 13:59 962see: http://www.it165.net/pro/h ... -
Android 4.4 实现状态栏(status bar)透明效果
2015-06-17 09:16 1421<style name="MyCusTheme ... -
Android
2014-06-12 16:33 0roboguice, http://daimajishu.it ... -
Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorVi
2013-01-23 14:16 1029<div class="iteye-blog- ... -
ADB server didn't ACK 解决方案
2012-12-27 16:54 9461.软件冲突。 首先是豌豆荚,尝试关闭豌豆荚,重启eclip ... -
Android Crash 报告反馈
2012-12-19 23:36 11661,Java中有一个接口,static interface T ... -
加密解密MD5
2012-08-03 09:37 10111,MD5加密!android 自带的MessageDiges ... -
快速查询A 到Z
2012-06-29 13:03 779/** * 快速查询View ...
相关推荐
《深入理解arm-none-eabi-gcc工具集合在MinGW环境中的应用》 在嵌入式系统开发领域,GCC(GNU Compiler Collection)是一个不可或缺的工具,它提供了编译、链接和其他必要的功能来创建软件。在MinGW(Minimalist ...
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架构的交叉编译工具链的压缩文件,其中"arm-eabi"代表ARM的嵌入式应用二进制接口(Embedded Application Binary Interface),这是一种用于ARM处理器的标准,确保不同...
在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"是一个针对ARM架构的交叉编译工具链的Windows版本安装程序。这个工具链由GNU Compiler Collection (GCC)提供,用于在非嵌入式系统(如个人电脑)上构建和...
}”代码,然后使用命令行工具链进行编译,如“arm-none-eabi-gcc -o main.elf main.c”。 总结,GCC for ARM None EABI是开发ARM架构嵌入式系统的重要工具,2020年第二季度的更新版本在性能、标准支持和错误处理等...
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分
`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-5_4-2016q3-20160926-win32”是指一个针对ARM架构、非嵌入式ABI(Application Binary Interface)的GCC(GNU Compiler Collection)编译器工具链。这个版本是2016年第三季度发布,具体...
《深入理解ARM-LINUX-ANDROIDEABI-4.9:构建NDK编译环境与CPU架构库》 在移动设备开发领域,Android NDK(Native Development Kit)扮演着至关重要的角色,它允许开发者使用C/C++编写底层代码,以实现高性能计算或...
标题中的"gcc-arm-none-eabi-10-2020-q4-major.zip"是一个用于嵌入式开发的工具包,特别针对ARM架构的微控制器。这个工具集包含了用于编译、链接和其他相关任务的工具,是开源软件GCC(GNU Compiler Collection)的...
标题 "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”指的是一个针对ARM架构的交叉编译工具链,该版本为2020年第二季度更新的Windows 32位版本。这个工具链是GCC(GNU Compiler Collection)的一个定制版本,专门...
标题中的"gcc-arm-none-eabi-7-2017-q4-major.zip"指示了这是一个2017年第四季度发布的GCC工具链的重大更新版本7。"major"表明这是一个重要的版本升级,可能包含性能优化、新特性或对标准库的改进。 在描述中提到的...
该工具是用在linux平台编译嵌入式arm平台代码的,可以编译简单的单片机程序,还可以编译uboot等,目前已经用了很久,编译器是arm-none-eabi的,以前用arm-linux编译总是用问题,换成这个版本的就好了,在此献上。
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-10.3-2021.10-win32.exe
标题中的"gcc-arm-none-eabi-9-2019-q4-major-win32.zip"是一个针对Windows操作系统的GCC交叉编译工具链压缩包。这个工具链是专门为ARM架构的微控制器和嵌入式系统设计的,使得开发者可以在运行Windows的个人电脑上...
`gcc-arm-none-eabi-4_9-2015q3-20150921-win32.zip` 是一个针对Windows操作系统的软件包,包含了GCC(GNU Compiler Collection)的一个特殊版本,专为在没有操作系统环境下的ARM处理器进行编译设计。GCC是GNU项目的...