使用arm-eabi-addr2line工具跟踪Android调用堆栈-程序员宅基地

技术标签: python  脚本  android  工具  signal  crash  

使用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/../../../../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>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qclzyr/article/details/7745801

智能推荐

BUUCTF-bjdctf_2020_babystack2-WP-程序员宅基地

文章浏览阅读137次。只有NX保护。_bjdctf_2020_babystack2

2022-06-30 Android app WakeLock息屏状态下唤醒屏幕并且解锁demo_自动唤醒屏幕并解锁-程序员宅基地

文章浏览阅读2.5k次。一、解锁二、获取电源锁,保持该服务在屏幕熄灭时仍然能唤醒三、权限申请四、各种锁的类型对CPU 、屏幕、键盘的影响:PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度ACQU_自动唤醒屏幕并解锁

告警选项[-Wpointer-sign]-程序员宅基地

文章浏览阅读1k次。https://gcc.gnu.org/onlinedocs/_-wpointer-sign

java计算机毕业设计汉中公交线路查询系统的设计与实现(附源码+springboot+开题+论文+部署)-程序员宅基地

文章浏览阅读755次,点赞12次,收藏9次。然而,随之而来的是公交线路查询和换乘的复杂性,传统的纸质线路图已无法满足市民高效、准确获取公交信息的需求。因此,开发一款汉中公交线路查询系统,将公交线路、车次、站点等信息整合到一个平台上,为市民提供实时、准确的公交信息查询服务,成为当前亟待解决的问题。首先,是用户管理模块的设计。首先,进行详尽的市场调研和需求分析,了解汉中市公交系统的现状和用户的实际需求,为系统的设计和开发提供有力的依据。另外,寻物启事、失物招领、投诉建议等模块的开发,将增强系统的互动性和实用性,为用户提供更加贴心的公交服务。

(免费赠源码)计算机毕设题目:springboot个人网盘92922(开题答辩+程序定制+全套文案 )上万套实战教程手把手教学JAVA、PHP,node.js,C++、python、大屏可视化-程序员宅基地

文章浏览阅读862次,点赞27次,收藏29次。免费领取项目源码,请关注●点赞●收藏并私信博主,谢谢~该平台采用的数据库是Mysql,SpringBoot框架,使用Java技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

云原生之使用Docker部署home-page个人导航页_docker 导航页-程序员宅基地

文章浏览阅读1.4k次,点赞10次,收藏4次。云原生之使用Docker部署home-page个人导航页_docker 导航页

随便推点

大数据|海豚调度官方文档注解(3)-程序员宅基地

文章浏览阅读2.4k次。该样例模拟了自定义参数任务,为了更方便的复用已有的任务,或者面对动态的需求时,我们会使用变量保证脚本的复用性。本例中,我们先在自定义脚本中定义了参数 “param_key”,并将他的值设置为 “param_val”。接着在"脚本"中声明了 echo 命令,将参数 “param_key” 打印了出来。当我们保存并运行任务后,在日志中会看到将参数 “param_key” 对应的值 “param_val” 打印出来。_海豚调度官方文档

我敢说这是Java面试史上最全的JAVA专业术语面试100问,先放50问_java 面试 专业回答-程序员宅基地

文章浏览阅读166次。前言:说在前面,面试题是根据一些朋友去面试提供的,再就是从网上整理了一些。先更新50道,下一波吧后面的也更出来。求赞求关注!!废话也不多说,现在就来看看有哪些面试题1、面向对象的特点有哪些?抽象、继承、封装、多态。2、接口和抽象类有什么联系和区别?3、重载和重写有什么区别?4、java有哪些基本数据类型?5、数组有没有length()方法?String有没有length()方法?数组没有length()方法,它有length属性。 S..._java 面试 专业回答

Rectangle与Circle相交_java判断矩形和圆形是否相交-程序员宅基地

文章浏览阅读1.5k次。计算矩形与圆形相交与否import javafx.scene.shape.Circle;import javafx.scene.shape.Rectangle;import java.math.BigDecimal;/** * 描述: 计算圆形与矩形之间图形相交工具类 * User: YueXZ * DateTime: 2021/12/8 17:22 * Version:1.0.0 */public class AreaMathUtil { public static B_java判断矩形和圆形是否相交

【Java学习之代码学习】 Prog09_整数分解因式_java一个整数分解因式-程序员宅基地

文章浏览阅读850次。每日一题:题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。_java一个整数分解因式

数据仓库--分布式_分布式数据仓库-程序员宅基地

文章浏览阅读459次,点赞14次,收藏13次。局部系统和全局数据的需求之间映射的定义是集中式的,而不是局部的。全局数据仓库的范围是在企业级集成的业务,包含历史数据以及必须在企业级继承的信息,全局数据可能来源于操作型系统,但通常来源于局部数据仓库。就数据层来说,全局数据仓库并不符合典型的数据仓库结构,细节数据存在于分支机构,轻度综合数据存在于集中全局层。局部数据仓库包含的是在局部站点上的历史的和集成的数据,局部数据仓库间的数据或数据结构不需要协调一致。数据导入到全局数据仓库时有一个简单的数据转换。原则上局部数据应局部使用,全局数据应全局使用。_分布式数据仓库

JQuery(8)_Jquery 表单选择器_下列哪项是jquey中的表单选择器-程序员宅基地

文章浏览阅读429次。本系列博客汇总在这里:JQuery 汇总Jquery 表单选择器表单选择器1、:input2、:text3、:password4、:radio5、:checkbox6、:submit7、:image8、:reset9、:button10、:file11、:hidden表单选择器1、:input用法: $(”:input”);返回值:集合元素。说明:匹配所有 input, textar..._下列哪项是jquey中的表单选择器

推荐文章

热门文章

相关标签