- 浏览: 19269 次
- 性别:
- 来自: 深圳
最新评论
使用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 530ApplicationInfo info ... -
android apk 一键加壳
2016-12-02 15:20 17371, 下载源码 https://github.com/Jian ... -
NDK 学习笔记
2016-07-07 11:13 3011,创建jni的java类自动生成jni头文件 a)新建Jni ... -
源码编译Apk时,是否生成odex方法
2016-06-15 11:09 9691,其实Android系统默认的配置是,如果没有指定DISAB ... -
分享代码到jCenter
2016-05-26 16:58 5221, 新建正常的一个library 2, 在library工程 ... -
分享代码到jCenter
2016-05-26 16:59 01, 新建正常的一个library 2, 在library工程 ... -
Android6.0编译过程
2016-05-25 13:36 3741, 购买vpn账号 2, 选择ubuntu版本, 编译6.0 ... -
Apk资源文件混淆[微信开源方法]
2016-03-03 11:18 17961,微信压缩方法_01: 1)生成好了的demo.apk; ... -
反编译步骤
2016-03-03 10:35 5031, 反编译命令: apktool.bat d /locat ... -
AS gradle
2016-03-02 11:09 11421,Eclipse项目直接导程Android Studio项目 ... -
Android Google 开源项目路径
2015-06-19 09:11 424Android Google 开源项目路径 : [需要翻!墙] ... -
Android Studio 配置 SVN
2015-06-18 13:59 890see: http://www.it165.net/pro/h ... -
Android 4.4 实现状态栏(status bar)透明效果
2015-06-17 09:16 1342<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 985<div class="iteye-blog- ... -
ADB server didn't ACK 解决方案
2012-12-27 16:54 9101.软件冲突。 首先是豌豆荚,尝试关闭豌豆荚,重启eclip ... -
Android Crash 报告反馈
2012-12-19 23:36 11321,Java中有一个接口,static interface T ... -
加密解密MD5
2012-08-03 09:37 9691,MD5加密!android 自带的MessageDiges ... -
快速查询A 到Z
2012-06-29 13:03 739/** * 快速查询View ...
相关推荐
arm-linux-androideabi-addr2line.exe -e libunity.sym.so -C -p -i -s -f 00111088
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...
gcc-arm-none-eabi-6-2017-q2-update-win32.exe windows 编译工具
该工具是用在linux平台编译嵌入式arm平台代码的,可以编译简单的单片机程序,还可以编译uboot等,目前已经用了很久,编译器是arm-none-eabi的,以前用arm-linux编译总是用问题,换成这个版本的就好了,在此献上。
windows最新版的gcc-arm-none-eabi-9-2020-q2-update-win32,外网下非常慢,不也不想收分,但是我需要分下载别的东西
gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2,官网最新的,官网下载比较慢。
gcc-arm-none-eabi-10-2020-q4-major-win32.exe
centos gcc-arm-none-eabi
gcc-arm-none-eabi编译链,包含windows下以及linux环境下的
gcc-arm-none-eabi 交叉编译器,本人主要用于编译STM32CubeMX生成的makefile工程,win10环境下运行。
gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-eabi.exe
The GNU Embedded Toolchain for Arm is a ready-to-use, open source suite of tools for C, C++ and Assembly programming targeting Arm Cortex-M and Cortex-R family of processors. It includes the GNU ...
gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2
gcc-linaro-7.4.1-2019.02-x86_64_arm-eabi_02(共2个压缩分卷)是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译32-bit Armv7 Cortex-A, soft-float, little-endian目标中的裸机程序、u-boot、Linux ...
arm-eabi-4.4.0.tgz arm-eabi-4.4.0.tgz
最新版本gcc-arm-none-eabi-7-2018-q2-update-win32windows安装包,官网下载太慢,分析一下
GNU ARM Embedded Toolchain, GCC ver 6.3.1-2017q2, gcc-arm-none-eabi-6-2017-q2-update-win32.zip
gcc编译器20220506 082534 版本为:gcc-arm-none-eabi-10.3-2021.10-win32 配合文章:nordic52832 nordic使用gcc编译环境搭建和使用说明
gcc-arm-none-eabi-10-2020-q4-major-aarch64-linux
gcc-linaro-7.4.1-2019.02-x86_64_arm-eabi.tar.xz交叉编译器是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译64-bit Armv8 Cortex-A, little-endian目标中的裸机程序、u-boot、Linux kernel、...